Creator 3D 在三维空间中,如何让一个物体朝向某个方形

Unity的实现方式
Vector3 dir = targetPos - this.transform.position; //获得某个方向 dir

//四元数Quaternion的LookRotation可以将一个方向转换成四元数转角
transform.rotation = Quaternion.LookRotation(dir); //物体朝向这个方向

Creator 3D的实现方式是什么?

var dir:Vec3 = targetPos.subtract(this.node.position); //获得某个方向 dir
this.node.rotation = ?? // 怎么把方向换算成角度,四元数Quat没有找到把方向转换为角度的方法

1赞

可以直接使用node的lookAt,或者根据里边的实现来自己计算:

    /**
     * @zh
     * 设置当前节点旋转为面向目标位置,默认前方为 -z 方向
     * @param pos 目标位置
     * @param up 坐标系的上方向
     */
    public lookAt (pos: Vec3, up?: Vec3): void {
        this.getWorldPosition(v3_a);
        Vec3.subtract(v3_a, v3_a, pos);
        Vec3.normalize(v3_a, v3_a);
        Quat.fromViewUp(q_a, v3_a, up);
        this.setWorldRotation(q_a);
    }

lookAt是瞬间朝向某个点。

我需要做的是从物体的当前朝向慢慢转向目标方向,有个平滑过渡的过程。比如第一人称角色慢慢转向自己的左边,总不能瞬间就转到目标方向吧,应该有个过程。

unity有个比较常用的慢慢转向目标方向的算法

float roatspeed = Time.deltaTime * 2.5; //转角速度

Vector3 moveDir = targetPos - this.transform.position; //targetPos是目标点

Vector3 newDir = Vector3.RotateTowards(transform.forward, moveDir, roatspeed , 0); // 匀速过渡
//Vector3 newDir = Vector3.Lerp(transform.forward, moveDir, roatspeed ); // 插值过渡
//Vector3 newDir = Vector3.SLerp(transform.forward, moveDir, roatspeed ); //球形插值过渡

transform.rotation = Quaternion.LookRotation(newDir); //朝向指定的方向

目前还不知到creator3D怎么实现

creator里用插值吧

用插值可以算得得过渡过程的方向,但是拿到方向没用,因为creator3D没有接口把方向转换成角度rotation

如果creator3D把unity的
Quaternion.LookRotation(方向);返回角度。
实现了就能做平滑过渡转角了

这个LookRotation应该就等同于这个吧

我试试看,单从名字上看就不像是转换转角的函数,没注意到

测了一下,这个能根据方向算出转角,不过和unity的Quaternion.LookRotation不同,Creator3D 的Quat.fromViewUp有个上方向的条件,算出的结果和Quaternion.LookRotation不一样,转向也有点怪异

lookat 很 nice

1赞

Unity的LookRotation也是有上方向的(第二个参数),也是默认是Y轴正方向,我们不一样的是默认的朝向是Z轴负方向。

可以试试这个方法

const dir = targetPos.sub(this.node.position).normalizeSelf()

const q_tmp = new cc.Quat()
cc.Quat.rotationTo(q_tmp, cc.v3(0, -1, 0), dir)
this.node.setRotation(q_tmp)

cc.v3(0, -1, 0)这个参数指的是 node 指向的方向,比如一个子弹的图片头部是朝下的,这个参数就填 cc.v3(0, -1, 0), 如果是朝上的就是 cc.v3(0, 1, 0)

1赞

这个和Quat.fromViewUp一样,用Quat.fromViewUp可以通过方向算得角度了,就是函数命名方面没用让用户一眼能看出是个转换方向成角度的函数

哇,你这个好用啊,比lookat好用多了,lookat 会朝向莫名的地方。。感觉lookat智障的一批

你试过了吗就很nice。。。醉了。。。

mark一下