繁体   English   中英

处理中的3D运动

[英]3D Movement in Processing

我正在制作使用Oculus Rift Dk1和库SimpleOculusRift的处理草图。 总的来说,我的问题是,我似乎无法找出一种方法来使裂谷运动和眼睛位置融合在一起。 因此,无论您以何种方式观看(在裂谷中)都是前进时您将移动的方向。

目前,我已经设置好了,因此您可以在AX和Z轴上移动。 (使用translate()和上下左右箭头键。)

我使用了库示例中的代码来获取所需的数字,这些数字显示了我正在查看的方向。

 PMatrix3D headOrientationMatrix = oculusRiftDev.headOrientationMatrix();
  headOrientationMatrix.translate( 50, 0, -10 );

  PVector eyePos = new PVector(0, 0, 0);
  PVector dir = headOrientationMatrix.mult(eyePos, null);

当我添加println(dir); 我得到一对3个看起来像这样的数字:

[ 1.7912731, -11.410956, -49.66469 ]
[ 1.7770205, -13.271997, -49.20057 ]
[ 2.1940613, -14.491295, -48.838394 ]
[ 2.7236567, -14.90203, -48.687893 ]
[ 3.203349, -14.766355, -48.700035 ]
[ 3.7733526, -14.435215, -48.758453 ]
[ 4.232833, -13.569878, -48.96878 ]
[ 4.137532, -13.105787, -49.103153 ]
[ 4.211087, -12.630456, -49.22132 ]
[ 4.1642704, -11.712718, -49.451702 ]
[ 3.9711514, -10.351211, -49.770298 ]
[ 6.6861124, -7.4438334, -49.998856 ]
[ 7.1228933, -7.5860662, -49.917095 ]

如果我向前看,我会得到类似于50,0,0的信息,而在我身后我会得到-50,0,0。 当我向右看时,我得到0,0,50,而我的左边就得到0,0,-50。 其他所有事物只是它们之间不断更新的数字。

对于网格移动,在一个简化的定义中-我使用了多个PVector,当您按下向上或向下或向左或向右箭头键时,会添加一个较小的数字,这可以使我运动。

这是我在网格上移动的代码:

void moveX() {
  //movement for x axis
  if (keyPressed == true) {
    if (key == CODED) {

      if (keyCode == LEFT) {
        walk.x += 1;
      } 
      if (keyCode == RIGHT) {
        walk.x -= 1;
      } 
    }
  }
  if(keyPressed == false){
    walk.x = 0;
  }
}


void moveZ() {
  //movement for z axis
  if (keyPressed == true) {
    if (key == CODED) {
      if (keyCode == DOWN) {
        walk.z -= .5;
      }  
      if (keyCode == UP) {
        walk.z += .5;
      }
    }
  }

  if(keyPressed == false){
    walk.z = 0;

  }
}

然后,我将PVector漫游添加到PVector生成中。 生成时,PVector是草图开始时的3个“生成”点。 步行PVector只需添加一个数字(或力)即可使其移动。

translate( spawn.x, spawn.y, spawn.z);

总之,我似乎无法弄清楚如何朝着使用Oculus Head Set的方向前进。 希望这足够清楚。 预先感谢任何可能解决我整天都在挑剔的问题的人。

由于我无法发布素描照片,因此基本上是一个3D网格框,您可以在处理过程中在其中移动。

据我了解,您希望始终朝着用户看好的方向前进。

使用向量是第一步。 您可以使用.add将向量的值相加。 因此,基本上对于每一帧: 新位置=位置+应用于当前位置的速度。 假设位置向量和速度

location.add(velocity)

由于您将在绘制/更新中添加“速度”,因此,您需要对加速度设置一些限制 ,与此相反,按下按钮的限制是点击数。

关于3D,如果您的意思是朝屏幕深度方向前进(例如在计算机游戏中),那么在处理过程中将为-Z。 如果需要,请检查3D转换。

从您的代码中,我可以看到您已经有了PVector目录。 但是,您还将需要一个位置向量,并用该位置减去输入,而不是相乘。 比您可能需要将normalize()方向,添加速度和更改最终添加到位置:

  PVector eyePos = new PVector(0, 0, 0);
  PVector location = new PVector(0, 0, 0);
  PVector dirOculus = headOrientationMatrix.mult(eyePos, null); //Double check, why you need to mult by null vector.
  PVector dir = PVector.sub(dirOculus, location);

  dir.normalize();
  acceleration = dir;
  velocity.add(acceleration);
  location.add(velocity);
  ----

我希望您有主意,可以将其自己放在上下文中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM