我有一个触控板,我想用来移动相机。我当前的代码通过将由1缩放的camera.direction向量添加到位置向量来移动摄像机。似乎我不能使用任何小于1的东西,因为当我这样做时它会开始旋转。我想要使用
touchpad.getKnobPercentX()
touchpad.getKnobPercentY()
根据旋钮的位置缩放它的方法。这个问题是它返回一个小于1的值。任何大于1的东西都会使相机移动太快。这是我用来更新相机的代码,因为我无法使用触控板旋钮。
private void setKnobAction() {
if (pad.getKnobPercentY() > 0f) {
camera.position.add(camera.direction.scl(1f));
camera.update();
}
if (pad.getKnobPercentY() < 0f) {
camera.position.sub(camera.direction.scl(1f));
camera.update();
}
if (pad.getKnobPercentX() > 0f) {
right = camera.direction.cpy().crs(Vector3.Y).nor();
camera.position.add(right.scl(1));
camera.update();
}
if (pad.getKnobPercentX() < 0f) {
right = camera.direction.cpy().crs(Vector3.Y).nor();
camera.position.sub(right.scl(1));
camera.update();
}
}
这个方法在我的render()方法中被调用,所以它被多次调用。此外,如果knobPercent为0,它将开始奇怪地旋转。
答案 0 :(得分:1)
Vector3.scl(float scalar)
的javadoc说:
通过标量
缩放此向量
这意味着,您实际上缩放了camera.direction
向量
鉴于,direction
向量通常是长度为1的Vector3
,给出每个轴的百分比,您应该注意到问题。
缩放它会导致每帧移动更快,缩小它会导致每帧移动更慢
例如:您向x方向移动,camera.direction
为Vector3(1, 0, 0)
。你按比例缩放2.
现在它是Vector3(2, 0, 0)
,你在此框架中移动了2个单位。再次,它被缩放,在下一帧中它是Vector3(4,0,0),你在这帧中移动4个单位。它一直在继续
缩放比例低于1也是如此。
更糟糕的是缩放为零,因为它将camera.direction
的长度设置为零。这意味着,您不再有关于方向的任何信息,这会导致奇怪的旋转。
所以你应该做什么:
存储另一个Vector3
,将camera.direction
的值复制到其中(在每个帧的开头),按getKnobPercentY()
进行缩放(实际上您应该按getKnobPercentY() * delta * speed
进行缩放)并将其添加到该位置
然后再次重置此Vector(将camera.direction
的值复制到它)并对x值执行相同的操作(ofc现在使用crs(Vector3.Y)
)