计算圆上的目标范围 Three.js
Calculate target range on circle Three.js
我有一道数学题正在苦苦挣扎。
我有一个特定的弧度,我想将相机指向 (camera.rotation.y)。我想告诉用户他们是否需要向左或向右平移以达到该弧度,容差为 PI/4。
我已经通过获取相机 + 推车旋转来标准化摇摄数
function getCurrentPan(){
return dolly.rotation.y + camera.rotation.y > 0
? (dolly.rotation.y + camera.rotation.y)%Math.PI
: ((dolly.rotation.y + camera.rotation.y)%Math.PI) + Math.PI;
}
所以它总是在 0 和 PI 之间。
我计划计算出我可以检查的范围,以查看用户是否需要向左或向右平移以达到该弧度。试试这个代码:
point.leftRange = {};
point.leftRange.min = point.pan - range > 0 ? point.pan - range : Math.PI - point.pan - range;
point.leftRange.max = point.leftRange.min - Math.PI/2 - range > 0 ? (point.pan - range)%Math.PI : (Math.PI - (point.leftRange.min - Math.PI/2 - range))% Math.PI;
console.log(point.leftRange);
point.rightRange = {};
point.rightRange.min = (point.pan + range) % Math.PI;
point.rightRange.max = (point.rightRange.min + (Math.PI/2 - range)) % Math.PI;
console.log(point.rightRange);
这给了我类似
的东西
- point.pan 1.464308692701496
- left.min 1.071609611002772
- left.max 0.8918857974908487
- right.min 1.8570077744002202
- right.max 3.0351050194963927
我尝试过的另一种方法是
var opp = (point.pan - Math.PI/2)%Math.PI;
opp = opp > 0 ? opp : Math.PI - opp;
if(getCurrentPan() > point.pan && getCurrentPan() < opp)
console.log('greater');
else if(getCurrentPan() < point.pan && getCurrentPan() > opp)
console.log('less');
如果平移像 0.5 并且左侧范围是 3 等(PI 的另一侧),这又不会考虑。
抱歉,我没有很好地解释这一点,但如果有人能指出正确的方向,我将不胜感激!
这是过度设计的。如果你想知道目标是在相机的左边还是右边,你可以这样做:
d = camera.getworlddirection();
diff = target.position - camera.position;
theta = atan2(diff.x,diff.z) - atan2(d.x,d.z);
这是您的相机所观察的位置与物体相对于相机的位置之间的角度。
所以:
if(abs(theta) < someThreshold){
if(theta > 0){
//its to the right
}
else{
//its to the left
}
}
我有一道数学题正在苦苦挣扎。
我有一个特定的弧度,我想将相机指向 (camera.rotation.y)。我想告诉用户他们是否需要向左或向右平移以达到该弧度,容差为 PI/4。
我已经通过获取相机 + 推车旋转来标准化摇摄数
function getCurrentPan(){
return dolly.rotation.y + camera.rotation.y > 0
? (dolly.rotation.y + camera.rotation.y)%Math.PI
: ((dolly.rotation.y + camera.rotation.y)%Math.PI) + Math.PI;
}
所以它总是在 0 和 PI 之间。
我计划计算出我可以检查的范围,以查看用户是否需要向左或向右平移以达到该弧度。试试这个代码:
point.leftRange = {};
point.leftRange.min = point.pan - range > 0 ? point.pan - range : Math.PI - point.pan - range;
point.leftRange.max = point.leftRange.min - Math.PI/2 - range > 0 ? (point.pan - range)%Math.PI : (Math.PI - (point.leftRange.min - Math.PI/2 - range))% Math.PI;
console.log(point.leftRange);
point.rightRange = {};
point.rightRange.min = (point.pan + range) % Math.PI;
point.rightRange.max = (point.rightRange.min + (Math.PI/2 - range)) % Math.PI;
console.log(point.rightRange);
这给了我类似
的东西- point.pan 1.464308692701496
- left.min 1.071609611002772
- left.max 0.8918857974908487
- right.min 1.8570077744002202
- right.max 3.0351050194963927
我尝试过的另一种方法是
var opp = (point.pan - Math.PI/2)%Math.PI;
opp = opp > 0 ? opp : Math.PI - opp;
if(getCurrentPan() > point.pan && getCurrentPan() < opp)
console.log('greater');
else if(getCurrentPan() < point.pan && getCurrentPan() > opp)
console.log('less');
如果平移像 0.5 并且左侧范围是 3 等(PI 的另一侧),这又不会考虑。
抱歉,我没有很好地解释这一点,但如果有人能指出正确的方向,我将不胜感激!
这是过度设计的。如果你想知道目标是在相机的左边还是右边,你可以这样做:
d = camera.getworlddirection();
diff = target.position - camera.position;
theta = atan2(diff.x,diff.z) - atan2(d.x,d.z);
这是您的相机所观察的位置与物体相对于相机的位置之间的角度。
所以:
if(abs(theta) < someThreshold){
if(theta > 0){
//its to the right
}
else{
//its to the left
}
}