三个 js 使用具有应用角度的矢量移动对象
Three js move object using vector with applied angle
在键盘按钮上,我正在调用以下函数。我只想在 Z 轴上应用移动。它完美运行。
// declared global Object3D object
function moveRight() {
v = new THREE.Vector3(0, 0, 0.01)
object.position.add(v)
}
但是,有时会出现模型已经旋转的情况。我将此旋转存储在变量“totalrotation”(以度为单位)中。在那种情况下,我想在正确的方向上移动我的对象(不仅仅是在 z 轴上)。我试过的是:
// declared global Object3D object
// declared global float totalrotation, lets say it is 90 deg
function moveRight() {
v = new THREE.Vector3(0, 0, 0.01)
rads = THREE.Math.degToRad(totalrotation)
v.applyAxisAngle( new THREE.Vector3(0, 1, 0), rads);
object.position.add(v)
}
但是没有用。然后我进一步尝试,并尝试将 rads 除以数字 4:
// declared global Object3D object
// declared global float totalrotation, lets say it is 90 deg
function moveRight() {
v = new THREE.Vector3(0, 0, 0.01)
rads = THREE.Math.degToRad(totalrotation) / 4
v.applyAxisAngle( new THREE.Vector3(0, 1, 0), rads);
object.position.add(v)
}
它开始按预期工作。
谁能解释一下,为什么第二个代码示例不起作用?在第二个示例中,我将正确旋转的矢量添加到我的对象中,但我不知道为什么我必须将角度除以数字 4。
EDIT1:这个问题无法解决,因为我在另一个方法中犯了错误,所以 totalrotation 应该大了 4 倍。没有“/ 4”分隔的一段代码正在运行。更多信息在回答中。
好的,我已经弄明白了。基本上我在另一种方法中不小心增加了 totalrotation 太多次。按下按钮后,我想添加 1 度角,相反,我为每个对象出现添加 1 度角。四次 1 度,等于 4,这就是为什么 totalangle 必须除以 4。
抱歉造成混淆,我想没有人知道它,因为我没有提供此功能。此方法:
function rotateLeft() { // this method gets invoked by keyboard press
for (var i = 0; i < objects.length; i++) {
if (objects[i][1] > 0) {
totalrotation += 1
rotateAboutPoint(objects[i][0], new THREE.Vector3(globalXpos, globalYpos, craneZ-1.06), new THREE.Vector3(0, 1, 0), THREE.Math.degToRad(1))
}
}
}
必须更改为:
function rotateLeft() { // this method gets invoked by keyboard press
totalrotation += 1
for (var i = 0; i < objects.length; i++) {
if (objects[i][1] > 0) {
rotateAboutPoint(objects[i][0], new THREE.Vector3(globalXpos, globalYpos, craneZ-1.06), new THREE.Vector3(0, 1, 0), THREE.Math.degToRad(1))
}
}
}
在键盘按钮上,我正在调用以下函数。我只想在 Z 轴上应用移动。它完美运行。
// declared global Object3D object
function moveRight() {
v = new THREE.Vector3(0, 0, 0.01)
object.position.add(v)
}
但是,有时会出现模型已经旋转的情况。我将此旋转存储在变量“totalrotation”(以度为单位)中。在那种情况下,我想在正确的方向上移动我的对象(不仅仅是在 z 轴上)。我试过的是:
// declared global Object3D object
// declared global float totalrotation, lets say it is 90 deg
function moveRight() {
v = new THREE.Vector3(0, 0, 0.01)
rads = THREE.Math.degToRad(totalrotation)
v.applyAxisAngle( new THREE.Vector3(0, 1, 0), rads);
object.position.add(v)
}
但是没有用。然后我进一步尝试,并尝试将 rads 除以数字 4:
// declared global Object3D object
// declared global float totalrotation, lets say it is 90 deg
function moveRight() {
v = new THREE.Vector3(0, 0, 0.01)
rads = THREE.Math.degToRad(totalrotation) / 4
v.applyAxisAngle( new THREE.Vector3(0, 1, 0), rads);
object.position.add(v)
}
它开始按预期工作。 谁能解释一下,为什么第二个代码示例不起作用?在第二个示例中,我将正确旋转的矢量添加到我的对象中,但我不知道为什么我必须将角度除以数字 4。
EDIT1:这个问题无法解决,因为我在另一个方法中犯了错误,所以 totalrotation 应该大了 4 倍。没有“/ 4”分隔的一段代码正在运行。更多信息在回答中。
好的,我已经弄明白了。基本上我在另一种方法中不小心增加了 totalrotation 太多次。按下按钮后,我想添加 1 度角,相反,我为每个对象出现添加 1 度角。四次 1 度,等于 4,这就是为什么 totalangle 必须除以 4。 抱歉造成混淆,我想没有人知道它,因为我没有提供此功能。此方法:
function rotateLeft() { // this method gets invoked by keyboard press
for (var i = 0; i < objects.length; i++) {
if (objects[i][1] > 0) {
totalrotation += 1
rotateAboutPoint(objects[i][0], new THREE.Vector3(globalXpos, globalYpos, craneZ-1.06), new THREE.Vector3(0, 1, 0), THREE.Math.degToRad(1))
}
}
}
必须更改为:
function rotateLeft() { // this method gets invoked by keyboard press
totalrotation += 1
for (var i = 0; i < objects.length; i++) {
if (objects[i][1] > 0) {
rotateAboutPoint(objects[i][0], new THREE.Vector3(globalXpos, globalYpos, craneZ-1.06), new THREE.Vector3(0, 1, 0), THREE.Math.degToRad(1))
}
}
}