对于我而言,经过数小时/天的搜索才能找到Three.js中这样一个核心问题的答案:我知道1)相机的位置(=我的眼睛)2)相机的方向(我的眼睛)3)我的方向。生成相机(我们忽略相机角度,近/远,aso)。我得到的最近如下:
camera = new THREE.PerspectiveCamera(150, window.innerWidth / window.innerHeight, 0.1, 5000);
camera.position.x = myParams.eye_x;
camera.position.y = myParams.eye_y;
camera.position.z = myParams.eye_z;
camera.rotateOnAxis(new THREE.Vector3(0,0,1), Math.PI /2);
camera.rotateOnAxis(new THREE.Vector3(0,0,1), Math.PI * (myParams.eye_deg2)/180);
camera.rotateOnAxis(new THREE.Vector3(sin(myParams.eye_deg2),-cos(myParams.eye_deg2),0), Math.PI * (myParams.eye_deg1+90)/180);
camera.updateProjectionMatrix();
其中eye_deg1
是眼睛的高点(-90:看底部,90:向上看),eye_deg2
(xy-平面方向,0:-x方向)。
前两个旋转位于同一轴上,可以一步完成。第二次轮换不起作用。
如果我切换位置和旋转的设置,我没有观察到任何变化(但旋转不会与翻译一起通勤?!?)。
但说实话,我只需要一个生成相机的功能,我不需要任何解释。我不明白为什么要解决这个简单的问题,我必须阅读一本600页的关于3D图形的书....
眼睛向量是(-cos a1 cos a2,-cos a1 sin a2,sin a1),其中a1 = eye_deg1,a2 = eye_deg2。 Three.js默认为(0,0,-1),即a1 = -90(底部)
头部向量是(-sin a1 cos a2,-sin a1 sin a2,cos a1)。 Three.js默认为(0,1,0),即a2 = 90。
一个例子,a1 = 0.眼睛向量是( - cos a2,-sin a2,0),头部向量是(0,0,1)。
答案 0 :(得分:0)
解决方案
camera = new THREE.PerspectiveCamera(150, window.innerWidth / window.innerHeight, 0.1, 5000);
camera.position.x = myParams.eye_x;
camera.position.y = myParams.eye_y;
camera.position.z = myParams.eye_z;
camera.up.set(
-sin(myParams.eye_deg1) * cos (myParams.eye_deg2),
-sin(myParams.eye_deg1) * sin (myParams.eye_deg2),
cos(myParams.eye_deg1)
);
camera.lookAt(new THREE.Vector3(
myParams.eye_x - cos (myParams.eye_deg1) * cos (myParams.eye_deg2),
myParams.eye_y - cos (myParams.eye_deg1) * sin (myParams.eye_deg2),
myParams.eye_z + sin (myParams.eye_deg1)
));