首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随着处理集成开发环境中mouseY的更改,Y形动态观察从上到下翻滚

问随着处理集成开发环境中mouseY的更改,Y形动态观察从上到下翻滚
EN

Stack Overflow用户
提问于 2011-09-13 06:05:24
回答 1查看 137关注 0票数 1

注意:这位于Processing IDE中

我正在试着让球面轨道向下运行,我几乎已经成功了。这就是我到目前为止所知道的:

代码语言:javascript
复制
float cameraTheta, cameraPhi, cameraRadius; //camera position in spherical coordinates
float camx, camy, camz;

void setup() {
  size(500, 500, P3D);
  background(255);
  cameraRadius = 200.0f;
  cameraTheta = 2.80;
  cameraPhi = 2.0;
  recomputeOrientation();
}


void draw() {
  background(255);
  lights();
  mouseMotion();
  camera(camx, camy, camz, 0, 0, 0, 0, -1, 0);
  sphereDetail(10);
  sphere(25);
}

void mouseMotion()
{
  if (mousePressed) {
    cameraTheta += (mouseX - pmouseX)*0.05;
    cameraPhi   += (mouseY - pmouseY)*0.05;
  }
  recomputeOrientation();     //update camera (x,y,z) based on (radius,theta,phi)
}

void recomputeOrientation()
{
  camx = cameraRadius * sin(cameraTheta)*sin(cameraPhi);
  camz = cameraRadius * -cos(cameraTheta)*sin(cameraPhi);
  camy = cameraRadius * -cos(cameraPhi);
  redraw();
}

X旋转效果很好,但是y旋转是从顶部到底部翻滚,然后随着mouseY的变化一次又一次地回滚,我需要的是,只要鼠标上下移动,它就会继续在一个方向上翻滚。有人能帮我解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-06 06:10:39

该问题与摄影机的up向量有关。如果你想象拿着相机,让它越来越接近球体的极点,当你经过极点时,你如何握住相机?由于camera function的upY参数,处理知道要做什么。

在当前代码中,upY始终为-1,这意味着当摄影机确定自身方向时,它将始终使用向量<0,-1,0>作为其up的参考。您需要更改这一点,以便当它到达球体的极点时,它会颠倒过来。

代码语言:javascript
复制
boolean flip = false;
...
void draw() {
    ...
    camera(camx, camy, camz, 0, 0, 0, 0, flip ? 1.0 : -1.0, 0);
    ...
}

void mouseMotion()
{
    if (mousePressed) {
        cameraTheta += (mouseX - pmouseX) * 0.05;

        if (cameraTheta < 0) cameraTheta += 2 * PI;
        else if (cameraTheta >= 2 * PI) cameraTheta -= 2 * PI;

        if (flip)
            cameraPhi += (mouseY - pmouseY) * 0.05;
        else
            cameraPhi -= (mouseY - pmouseY) * 0.05;

        if (cameraPhi >= PI) {
            cameraPhi = PI - 0.01;
            cameraTheta += PI;
            flip = !flip;
        }
        else if (cameraPhi <= 0) {
            cameraPhi = 0.01;
            cameraTheta -= PI;
            flip = !flip;
        }
    }

    recomputeOrientation();
}

值得注意的事情:

  1. I添加了代码以将cameraTheta保持在[0,2* PI)范围内,并将cameraPhi保持在[0.01,PI -0.01]范围内。从数学上讲,cameraPhi应该在[0,PI)范围内,但这会导致极点闪烁。有关此操作背后的数学原理,请检查here.
  2. cameraPhi在flip为true时反向递增。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7394600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档