creator3d节点方向bug,节点的forward属性的方向和节点z轴朝向写反了

目前节点按照自身的forward方向移动会朝着节点的z轴的反方向移动,按理说,forward是指节点z轴的正朝向才对。

节点z轴朝向世界坐标

朝向z轴正方向: this.node.forward (0,-1)
朝向z轴负方向: this.node.forward (0,1)
朝向x轴正方向: this.node.forward (0,-1)
朝向x轴负方向: this.node.forward (0,1)

creator3d和creator3.0都有这个问题

引擎的正方向是 -Z

1赞

u3d和c3d的Z轴坐标是反的。想不到吧。

unity的坐标系是左手坐标系,c3d的是右手坐标系。节点的forward在unity里很好理解,就是z轴的正方向,所以美术做模型,角色的脸朝向默认是z轴的正方向。在c3d里forward变成z的反方向了,概念不好理解了,角色的移动只能反着foward走,好别扭。能不能把forward同一成z的正方向,主要是考虑到角色模型朝向的问题

引擎的 camera,目前在 Creator 中是这样的:
image
摄像机的朝向是朝向 -z
因此其它角色的朝向都得是 -z,否则逻辑就不统一了。
(目前 camera forward 时,会离对象越来越近,如果 camera 朝 z 就会导致 forward 时远离被拍摄对象)

虽然这样一来就会很尴尬。比如 Vec3.FORWARD 的值是 (0, 0, -1)…

感觉还是习惯左手坐标系,,,,

不是这样理解的,在c3d里,角色(脸朝向自身Z轴正方向)角度是(0,0,0)。
当摄像头角度是(0,0,0)时,角色的forward的值为(0,-1,0)
当摄像头角度旋转成(0,180,0)时,角色的forward的值还是(0,-1,0)

角色的forward只会和世界坐标轴有关,和摄像机无关,就算场景没有摄像机,forward还是不受影响的

角色移动都是按脸朝向移动的,比如第一人称和第三人称,当然像螃蟹是横着走又是个例外。现在角色模型资源一般是按模型空间的Z轴正方向做默认脸朝向,目前c3d刚好forward是和模型的z轴方向相反的。控制角色按脸朝向移动就要用到forward,所以要做正确的移动要么让美术把模型资源的脸朝向全改成模型的-z方向(工作压力交给美术了),要么就把forward乘以-1再用,这些都能解决问题。

解决问题都是小意思,就是对每个c3d的使用者不好理解forward,特别是u3d转过来的,按u3d那样理解肯定掉坑里

如果你认为角色的forward和camera有关的话,那么场景里把摄像机删除的话是不是角色就不存在forward了。
我做了测试了,无论怎么转摄像机,只要角色角度不动,forward的值永远不变,把摄像机删了,值也不变

好的,咨询一下引擎组的同学。不过从开发者的角度看,始终觉得你们把forward做反了。坐标系用的是右手坐标系,但是计算forward时用了左手坐标系

666,我也有这个疑问,其实像你说的解决问题是有很多办法,但是追根究底这个精神,佩服

只是我个人对待问题的方式,我觉得,应该是引擎方去契合开发者的习惯,而不是让开发者去适应引擎,这样引擎方就不知道开发者的难处,就变成了为自己做引擎而不是为开发者做引擎

我能理解你的困惑,我们的 forward 定义实际上基于右手坐标系的前提下面向屏幕前方的方向,并不是和 Camera 相关,内部之前讨论过,觉得这样做会更符合直觉。同时我们还提供了一个 Vec3.UNIT_Z 的向量是正值。

使用右手系的原因是 Cocos Creator 2.x 中 x, y 平面就是 y 朝上,x 朝右,所以右手系能够保障延续性。

可以看看

Vec3.UNIT_Z 这个是没什么用的,是个常量,角色只要角度转动,forward会一直变。目前只能forward * -1才行

企业微信截图_16099225852537

现在的模型资源,无论是哪个游戏,或者网上下载的模型资源,角色的朝向都是模型的Z正方向。目前为了适应你们的设计,只能forward * -1 得到符合模型的正方向。大家都把forward * -1 那么 forward的直接存在意义就没有了。你们觉得forward还是继续保持现状比较好的话,能不能在node节点上多加个back方向,这样开发者直接用back就好了

u3d的transform就提供有 forward,back, right,up 这些通用方向属性,开发者省去了自己运算。

其实你也没理解对forward,node的forward不是面向平面前方的方向。而是节点相对于世界坐标系的方向。

我把player的节点
角度设置为 (0,0,0) this.node.forward的值是(0,0,-1)
角度设置为 (0,60,0) this.node.forward的值是(-0.86,-1,-0.5)
角度设置为 (0,180,0) this.node.forward的值是(0,0,1)
角度设置为 (0,225,0) this.node.forward的值是(0.707,0,0.707)

你说的forward是指世界坐标的forward,我说的forward是节点自身的forward

我重新找了一下历史,可以在资源生产和导入阶段解决朝向的差异,参考我们的文档

https://docs.cocos.com/creator/3.0/manual/zh/asset/dcc-export-mesh.html?h=导入

使用 -z 作为 forward 只是一个选择,这是为了在右手系中保持 x 朝右,Unity 和 Unreal 是通过使用左手系来让开发者使用更自然,Godot 和我们的选择是一样的,都是右手系,-z 作为 forward

知道你的意思

只是开发者做角色向朝向移动时,只能这样写了

var moveDir = this.player.node.forward.multiplyScalar(-1); // 先反转节点朝向
this.player.node.position = this.player.node.position.add(moveDir.multiplyScalar(速度));//角色往朝向移动

1赞

左右手之争之前论坛有过很多次了。我们由于 Cocos 的历史原因,一直采用的是右手系。
在右手系下,如果 z 朝前,会导致角色的 x 朝左而不是朝右。这个确实会比较反人类。
因此权衡之下,还是让 z 朝后好点。