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 lookAt():如何指向某个*非';t*朝向另一个对象的正Z轴_Javascript_Three.js - Fatal编程技术网

Javascript three.js lookAt():如何指向某个*非';t*朝向另一个对象的正Z轴

Javascript three.js lookAt():如何指向某个*非';t*朝向另一个对象的正Z轴,javascript,three.js,Javascript,Three.js,我正在创建一个应用程序,其中一个人(现在我使用的是圆锥形)站在某个表面上(现在我使用的是纵向放置的圆柱体),我希望他们的脚朝向某个点(现在它是圆柱体的中心) (编辑:我刚刚意识到这张照片中我的Z轴指向错误的方向;它应该指向相机,但问题没有改变。) 下面是一个版本的代码,类似于我试图完成的。(使用箭头键移动圆锥体) 上面的代码给了我一些类似于我正在寻找的东西,但问题是lookAt()似乎总是指向某个方向的局部正Z轴,我更希望它指向局部负Y轴 我不想改变模型本身的x,y,z轴,因为我觉得当我将其他逻

我正在创建一个应用程序,其中一个人(现在我使用的是圆锥形)站在某个表面上(现在我使用的是纵向放置的圆柱体),我希望他们的脚朝向某个点(现在它是圆柱体的中心)

编辑:我刚刚意识到这张照片中我的Z轴指向错误的方向;它应该指向相机,但问题没有改变。)

下面是一个版本的代码,类似于我试图完成的。(使用箭头键移动圆锥体)

上面的代码给了我一些类似于我正在寻找的东西,但问题是lookAt()似乎总是指向某个方向的局部正Z轴,我更希望它指向局部负Y轴

我不想改变模型本身的x,y,z轴,因为我觉得当我将其他逻辑应用到person对象时,这将是一个很难处理的问题

是否有方法更改axis lookAt()使用的对象?还是我必须使用自己的lookAt()函数?谢谢~

是否有方法更改axis lookAt()使用的对象

否,3D对象(不包括相机)的默认本地
正向
矢量为
(0,0,1)
。与其他引擎不同,
three.js
不允许配置
forward
向量,只允许配置
up
向量。但这对你的情况并没有什么帮助

可以尝试变换几何体以获得类似效果


如果出于某些原因不想这样做,并且仍然想使用
Object3D.lookAt()
,则必须计算不同的目标向量(因此不是圆柱体的中心)。

即使
lookAt
方法的前向向量无法更改(如@Mugen87所述),你可以通过事先知道前向Z轴和你认为你的网格是“向上”的轴(EX:站在Y轴上)来调整局部旋转。 基本上,在您的情况下,只需在
lookAt
方法之后添加这一行:

mesh.rotateOnAxis(新的三矢量3(1,0,0),Math.PI*-0.5);

圆锥体将向上看:)

我也有这个问题,我希望对象的局部x轴指向注视坐标。你的建议是找到一个新的目标?你能描述一下新的x,y,z是什么吗?谢谢当我射入代码笔时,没有运行按钮,也没有自动运行。我如何运行它?对不起,我是codepen noob![自我解释]“3D对象(不包括摄影机)的默认局部前向向量为(0,0,1)”:从three.js代码中,我了解到摄影机和灯光的局部前向向量为(0,0,-1)。只有摄影机具有不同的前向向量。
//...

person = CreatePerson();
person.mesh.up = new THREE.Vector3(0, 0, 1);

//
// ...
// 

function updateObj(obj, aboutObj=false){
    let mesh = obj.mesh;
    if (aboutObj) {
        mesh.lookAt(
            aboutObj.mesh.position.x, 
            aboutObj.mesh.position.y, 
            mesh.position.z)
    };
}

//
// ...
//

function animate() {
    // ...

    updateObj(person);

    // ...
}