我使用libGDX进行3D游戏。在此游戏中, 3D箭头应指示3D空间中的某个方向。当玩家移动时,每个帧都会更新3D箭头的方向。
我想将箭头放在方向上,相机在相机前看 3个单位,这样箭头始终可见。因此,我将摄像机方向添加到当前摄像机位置,并将其用作箭头的平移部分。通过从目标中减去箭头位置来计算方向。
所有这一切都正常,箭头显示在正确的位置,然后移动。问题是,有时指向目标,有时不指向。
这是我的代码:
Vector3 targetPosition = new Vector3(1, 1, 10);
Vector3 cameraPosition = gameController.getCamera().position.cpy();
Vector3 cameraDirection = gameController.getCamera().direction.cpy();
Vector3 up = gameController.getCamera().up.cpy();
Vector3 arrowPosition = cameraDirection.scl(3).add(cameraPosition);
Vector3 arrowDirection = targetPosition.cpy();
arrowDirection = arrowDirection.sub(arrowPosition).nor();
Matrix4 transformationMatrix = new Matrix4();
// calculate orthogonal up vector
up.crs(arrowDirection).crs(arrowDirection);
arrowModel.transform = transformationMatrix.setToLookAt(arrowDirection,
up).trn(arrowPosition);
为避免向量计算错误,添加了一些调试行:
modelBuilder.begin();
MeshPartBuilder partBuilder = modelBuilder.part("lines", GL20.GL_LINES,
Usage.Position,
new Material(ColorAttribute.createDiffuse(Color.GREEN)));
Vector3 linePos = arrowPosition.cpy();
partBuilder.line(linePos.cpy().add(arrowDirection), linePos);
partBuilder.line(linePos.cpy().add(up), linePos);
debugModel = new ModelInstance(modelBuilder.end());
结果,我看到向上矢量的正确绿线(相机的当前向上矢量),并且绿线正确指向我的目标,绿色立方体< / strong>即可。箭头做了其他事情:
http://www.directupload.net/file/d/3638/2ka7kvvj_jpg.htm
在图片中箭头非常接近正确的方向(绿线),还有其他情况,它指向完全错误的方向。
我使用了很多.translate,.trn,.setToLookAt和.rotate的组合,但它们都显示出类似的错误结果。
你知道这里出了什么问题吗?