去年我发布了一个similar question,但由于它不是很具描述性而且整体上一团糟,我决定完全重写它。
我正在JavaFX中制作一个简单的3D编辑器,它具有类似于Blender或几乎任何其他镜头的相机移动。我添加了围绕x轴的旋转,然后使用三角函数我计算了其他2个旋转(y和z轴)。 x和y轴旋转都是相对于枢轴点进行的,但是z旋转始终是相对于屏幕/摄像机而不是其枢轴点进行的。
为了更好地理解这个问题,我勾画了轴的位置以及我想要的地方:
以下是我用来计算角度的代码部分(虽然根据我的观察,这似乎与我的问题无关):
//variables angleY and angleX are calculated according to mouse drags on the screen
rotateY.setAngle(angleY);
rotateX.setAngle(angleX*Math.cos(Math.toRadians(angleY)));
rotateZ.setAngle(angleX*Math.sin(Math.toRadians(angleY)));
为了简化测试,我在Pastebin上传了the code。
编辑:我可以通过旋转所有内容来实现同样的效果,但相机(这正是相机移动所做的事情)和使用x轴进行提升,但我正在寻找更优雅的解决方案。
答案 0 :(得分:0)
我决定使用上面提到的解决方案。我为每个元素创建了一个组,但是相机然后在y轴上旋转了元素。对于高程(x轴),我旋转相机。事实证明这是解决我问题的一个非常好的解决方案。
编辑:由于这不是我上面提到的问题的答案,我决定找出真正出错的地方。我正在玩变换,发现它们按照你将它们添加到变换数组的顺序应用。真正的问题是我在XYZ顺序中应用了旋转,因此x旋转在y旋转之前完成,所以它与它无关。更改从XYZ到YXZ的转换顺序修复了所有问题。