Javascript Three.js-单独旋转相机';父母
我有一个场景,在这个场景中,一个对象沿着Javascript Three.js-单独旋转相机';父母,javascript,three.js,Javascript,Three.js,我有一个场景,在这个场景中,一个对象沿着CatmullRomCurve3路径移动,按下left或down箭头键时向左移动,按下right或up箭头键时向右移动 最初,我希望对象与路径成90度角,而不是沿着路径。你可以在那里找到这个场景的代码。这个问题是用计算机解决的 基本上,我所要做的就是实现以下代码来旋转对象: object.lookAt((p2).sub(p1).applyAxisAngle(axis, -Math.PI * 0.5).add(p1)); 虽然对象现在已正确旋转,但我现在遇
CatmullRomCurve3
路径移动,按下left
或down
箭头键时向左移动,按下right
或up
箭头键时向右移动
最初,我希望对象与路径成90度角,而不是沿着路径。你可以在那里找到这个场景的代码。这个问题是用计算机解决的
基本上,我所要做的就是实现以下代码来旋转对象:
object.lookAt((p2).sub(p1).applyAxisAngle(axis, -Math.PI * 0.5).add(p1));
虽然对象现在已正确旋转,但我现在遇到的问题是摄影机
与对象朝向不同的方向,或与对象一起移动(我想要对象的过肩透视图),但有人建议我通过将摄影机作为对象的子对象添加来解决此问题,这很有效
新问题
现在,我希望对象的默认位置与路径成90度角(按原样),但当按下左
或下
箭头时,我希望对象面向左侧(沿原来的路径返回),当按下右
和上
箭头时,对象面向另一方向
我通过在render
循环中设置一些if
语句,将-Math.PI*0.5
的值更改为-Math.PI*2
或-Math.PI*0.5
,具体取决于按下哪个键
但是,这也会导致相机采用新的lookAt
值,因为它是对象的子对象,但我希望相机始终保持在相同的位置(即,与路径成90度角,就像对象静止时那样)
那么,当对象发生变化时,我如何阻止相机旋转/移动/更改它的查看(我不确定它是哪一个?
我对相机所做的一切似乎都不会影响它,它总是锁定在物体的同一方向上
提前谢谢。我希望我正确理解了你的问题:
var scene=new THREE.scene();
var摄像机=新的三透视摄像机(60,window.innerWidth/window.innerHeight,11000);
摄像机位置设置(0,20,-20);
摄像机。注视(0,0,0);
var renderer=new THREE.WebGLRenderer({
反别名:对
});
renderer.setSize(window.innerWidth、window.innerHeight);
document.body.appendChild(renderer.doElement);
var grid=new THREE.GridHelper(300,30);
网格位置setZ(100);
场景.添加(网格);
变量点=[
新的三个矢量3(-80,5,35),
新的三个矢量3(-80,5192.5),
新的3.Vector3(80,5192.5),
新的三,矢量3(80,5,35)
];
var曲线=新的三点曲线3(点);
curve.closed=真;
var curvePoints=curve.getPoints(200);
var geomecurvepath=新的三个.BufferGeometry().setFromPoints(曲线点);
var matCurvePath=新的三线基本材质({
颜色:0xff0000
});
var CurvePath=新的三条直线(geomCurvePath、matCurvePath);
场景。添加(曲线路径);
var group=新的三个.group();
场景。添加(组);
组。添加(摄像头);
var pointerGeom=新的三点共计量法(4,20,4);
pointerGeom.translate(0,10,0);
pointerGeom.rotateX(数学PI*0.5);
var pointer=new THREE.Mesh(pointerGeom,new THREE.MeshNormalMaterial());
添加(指针);
btnLeft.addEventListener(“单击”,函数(){
旋转(数学PI*0.5)
});
btnRight.addEventListener(“单击”,函数(){
旋转(-Math.PI*0.5)
});
功能转向(角度){
指针.rotation.y+=角度;
}
var p1=新的3.Vector3();
var p2=新的3.Vector3();
var lookAt=new THREE.Vector3();
变量轴=新的三个向量3(0,1,0);
风险值百分比=0;
render();
函数render(){
请求动画帧(渲染);
百分比+=0.0005;
曲线.getPointAt(百分比%1,p1);
曲线.getPointAt((百分比+0.001)%1,p2);
lookAt.copy(p2).sub(p1).applyAxisAngle(axis,-Math.PI*0.5).add(p1);//查看距离路径90度的点
组位置副本(p1);
组。注视(注视);
渲染器。渲染(场景、摄影机);
}
正文{
溢出:隐藏;
保证金:0;
}
#钮扣{
位置:绝对位置;
}
左边
正确的
您可以使用THREE.Group()
,将对象和相机添加到其中。当该组从路径向外看90度时,您可以随意旋转对象,相机保持静止。@prisoner849几乎可以工作,但现在object.lookAt((p2).sub(p1).applyAxisAngle(axis,-Math.PI*2).add(p1))代码>旋转异常(似乎在所有轴上旋转/注视,而不仅仅是在y轴上)。你没有直接解决它,但你让我意识到它不起作用的原因是因为我试图更改对象的注视()
当我所要做的就是用Math.PI正常旋转它,因为它没有沿着路径,但它的父组是!再次谢谢你,哈哈