Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Three.js-单独旋转相机';父母_Javascript_Three.js - Fatal编程技术网

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正常旋转它,因为它没有沿着路径,但它的父组是!再次谢谢你,哈哈