我正在使用Oculus RiftDk1和SimpleOculusRift库制作一个处理草图。总的来说,我的问题是,我似乎无法找到一种方法来将运动和眼睛位置结合在裂缝上。所以无论你在看什么(在裂缝中),当你向前击球时,你都会移动的方向。
目前,我已经设置好了,所以你可以在x和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头显朝着我期待的方向前进。希望这足够清楚。提前感谢任何可能解决我一整天都在选择的这个问题的人。
因为我不能发布我的草图照片,所以它基本上是一个3D的网格框,你可以在处理过程中四处移动。
据我所知,您希望始终朝着用户所看的方向前进。
使用向量是第一步。您使用. add添加向量的值。所以基本上对于每一帧:新位置=定位到当前位置的应用速度。假设位置向量和速度
location.add(velocity)
由于您将在绘图/更新中添加“速度”,因此您需要对加速度设置一些限制,而不是按下限制为点击次数的按钮。
关于3D,如果你指的是前进,比如走向屏幕的深度(比如在电脑游戏中),那将是处理中的-Z。如果需要,请查看3D转换。
从你的代码中,我可以看到你已经有了PVector目录。然而,你也需要一个位置向量,并用位置减去输入,而不是相乘。你可能需要归一化()方向,将速度和变化最终添加到位置:
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);
----
我希望你有这个想法,并能把它放在上下文中。