我需要模拟一行(桨)的运动。使用min3D库将oar对象加载到eclipse中,该库与openGL一起使用。
此时,我使桨在3轴x,y和z上移动,但我无法控制此移动并使桨以所需方式移动。
(不要关注价值观,不是真正的价值观)
这是加载桨的类,将它放在屏幕上并移动它:
public class Obj3DView extends RendererFragment {
private Object3dContainer rowObject3D;
/** Called when the activity is first created. */
@Override
public void initScene() {
scene.lights().add(new Light());
scene.lights().add(new Light());
Light myLight = new Light();
myLight.position.setZ(150);
scene.lights().add(myLight);
IParser myParser = Parser.createParser(Parser.Type.OBJ, getResources(), "com.masermic.rowingsoft:raw/row_obj",true);
myParser.parse();
rowObject3D = myParser.getParsedObject();
rowObject3D.position().x = rowObject3D.position().y = rowObject3D.position().z = 0;
rowObject3D.scale().x = rowObject3D.scale().y = rowObject3D.scale().z = 0.28f;
scene.addChild(rowObject3D);
}
//THIS MAKES THE OAR MOVE
@Override
public void updateScene() {
rowObject3D.rotation().x += 1; //pitch
rowObject3D.rotation().z += 1; //roll
rowObject3D.rotation().y += 0.5; //yaw
}
roation()方法定义:X/Y/Z euler rotation of object, using Euler angles. Units should be in degrees, to match OpenGL usage
。
所以问题是如何定义使桨模拟真实运动的值?
答案 0 :(得分:0)
这看起来更像是一个数学问题。 我将提供一些一般性提示;
桨的固定点是桨固定在船上的位置,因此桨的旋转是相对于该点的,而不是桨的中心。 最重要的是,船正在移动,桨也是固定的#34;点。
定位顺序应为: 转换到船位。 翻译桨,使其中心相对于船的正确位置。 应用桨旋转。 画出来。
如果你改变你的模型,那么动画将更容易,因为原点位于修复桨的位置,但如果你后来假装对桨进行更复杂的操作,它可能会使其他动画/计算复杂化。
欧拉旋转的插值是一团糟,我建议四分之一。您可以从漂亮的图片中获取角度并进行插值。 (如果你需要Euler,你仍然可以将最终结果转换为Euler)
对于简单的动画,(比如你只是想让桨以某种模式重复旋转),几乎没有你会找到一个更好的方法然后是关键帧,也就是说,沿你想要的路径创建一个坐标/角度列表要做,并迭代它们,插值。 有了足够的点,简单的线性插值就可以了。