根据其四元数在 3D 中移动 cannonJS object
Moving cannonJS object in 3D according to its quaternion
我想在 cannonJS body 上实现 space 像船一样的移动。
(我真的是初学者)
我找到了一些示例,但其中 none 正是我要找的。
据我所知,移动 object 的正确方法是改变它的速度。
这是我在这里所做的:http://codepen.io/Tomo0613/pen/xVjqqK enter code here
但我对四元数的理解肯定有问题。
有没有办法在我旋转它时根据它的四元数更新 body 的向量,或者它总是与世界相关?
结果:当 body 仅在 Z 轴上加速时,它始终会朝它所面对的方向移动。
Body 上的速度始终在世界坐标中。对于这种情况,您可能希望在变量中跟踪局部速度(例如 vec(0,0,+1)
),然后将其转换为 world 速度并将其应用于 Body时间轮换变化。
var localVelocity = new CANNON.Vec3(0, 0, 1);
var worldVelocity = body.quaternion.vmult(localVelocity);
body.velocity.copy(worldVelocity);
或者,相同代码的更快但更难阅读的版本:
var localVelocity = new CANNON.Vec3(0, 0, 1);
body.quaternion.vmult(localVelocity, body.velocity);
我可能遗漏了什么,但接受的答案似乎回答了不同的问题。
对我来说,向前加速就像这样做一样简单:
const enginePower = new CANNON.Vec3(0, 0, 500); // engine strength
const origin = new CANNON.Vec3(0, 0, 0); // where the ship is pushed from
physicsBody.applyLocalImpulse(enginePower, origin); // push it "forward"
请注意,我的船在导入后指向 z-direction,因此功率 (500) 位于 z。您可能需要根据您自己的船的“前进”方向更改您的。当您的船在世界中旋转时,“前进”方向不会相对于船改变(但 确实 相对于世界改变)所以事情应该一致地工作。
对于旋转,你可以这样做:
const turnLeft = new CANNON.Vec3(0, 2500, 0); // yaw, left
const turnRight = new CANNON.Vec3(0, -2500, 0); // yaw, right
// etc..
physicsBody.applyTorque(turnLeft);
作为奖励,如果您想要恒定的最高速度而不用太担心真实性,您可以在 body 中添加线性和 angular 阻尼。请注意,这可能需要增加发动机和扭矩,具体取决于您的口味。
physicsBody.linearDamping = 0.9;
physicsBody.angularDamping = 0.9;
我想在 cannonJS body 上实现 space 像船一样的移动。 (我真的是初学者) 我找到了一些示例,但其中 none 正是我要找的。
据我所知,移动 object 的正确方法是改变它的速度。
这是我在这里所做的:http://codepen.io/Tomo0613/pen/xVjqqK enter code here
但我对四元数的理解肯定有问题。
有没有办法在我旋转它时根据它的四元数更新 body 的向量,或者它总是与世界相关? 结果:当 body 仅在 Z 轴上加速时,它始终会朝它所面对的方向移动。
Body 上的速度始终在世界坐标中。对于这种情况,您可能希望在变量中跟踪局部速度(例如 vec(0,0,+1)
),然后将其转换为 world 速度并将其应用于 Body时间轮换变化。
var localVelocity = new CANNON.Vec3(0, 0, 1);
var worldVelocity = body.quaternion.vmult(localVelocity);
body.velocity.copy(worldVelocity);
或者,相同代码的更快但更难阅读的版本:
var localVelocity = new CANNON.Vec3(0, 0, 1);
body.quaternion.vmult(localVelocity, body.velocity);
我可能遗漏了什么,但接受的答案似乎回答了不同的问题。
对我来说,向前加速就像这样做一样简单:
const enginePower = new CANNON.Vec3(0, 0, 500); // engine strength
const origin = new CANNON.Vec3(0, 0, 0); // where the ship is pushed from
physicsBody.applyLocalImpulse(enginePower, origin); // push it "forward"
请注意,我的船在导入后指向 z-direction,因此功率 (500) 位于 z。您可能需要根据您自己的船的“前进”方向更改您的。当您的船在世界中旋转时,“前进”方向不会相对于船改变(但 确实 相对于世界改变)所以事情应该一致地工作。
对于旋转,你可以这样做:
const turnLeft = new CANNON.Vec3(0, 2500, 0); // yaw, left
const turnRight = new CANNON.Vec3(0, -2500, 0); // yaw, right
// etc..
physicsBody.applyTorque(turnLeft);
作为奖励,如果您想要恒定的最高速度而不用太担心真实性,您可以在 body 中添加线性和 angular 阻尼。请注意,这可能需要增加发动机和扭矩,具体取决于您的口味。
physicsBody.linearDamping = 0.9;
physicsBody.angularDamping = 0.9;