v2.1.0,我只想简单的设置个旋转而已……

v2.1.0,我只想简单的设置个旋转而已,为什么还要搞四元数和欧拉角度的转换……
.
.
.

在 v2.1.0 中,由于 rotationY 被警告 DEPRECATE相关文档

我们得从这样:

if (this.m_stNode.rotationY != iNewRotationY) {
this.m_stNode.rotationY = iNewRotationY;
}

改成这样来消除警告:

this.m_stNode.is3DNode = true; // 这个必须要有

if (this.m_stNode.eulerAngles.y != iNewRotationY) {
let newRotation: Quat = new Quat();
let newEulerAngles: Vec3 = this.m_stNode.eulerAngles;
newEulerAngles.y = iNewRotationY;
newRotation.fromEuler(newEulerAngles);
this.m_stNode.setRotation(newRotation.x, newRotation.y, newRotation.z, newRotation.w);
}


感觉这样好不方便啊… :cry:还是我的姿势不标准?
这样当然是不行的:

if (this.m_stNode.eulerAngles.y != iNewRotationY) {
this.m_stNode.eulerAngles.y = iNewRotationY;
}


.
.
.
也或者,可以这样改
保留 rotationY 的写法(但同时也保留了警告),
只将当前节点的 is3DNode 设为 true 即可。

如果只是简单的做2d水平旋转的话
在2.1使用的是节点上的angel属性
修改节点的angel属性不会触发警告,对应的 它的旋转方式与设置rotation时相反
如果是3D旋转的话 你上面的做法是对的

不对吧,angle 是平面的顺/逆时针旋转,
rotationY该节点 Y 轴旋转角度
所以,angle 就是 “rotationZ” 而已,不一样的。

我们的实际需求是,水平180度翻转,其实用 scaleY 更简单,
但一旦是特定角度的旋转需求,就只能开启 is3DNode 并搞四元数和欧拉角度的转换那一套了…

你好 你可以这样做

node._eulerAngles.y = 78;
node._fromEuler();

感谢,这确实是个简单的法子。
但我们是用 ts 发开,WebStorm 下会有报错提示(但实际上代码是生效的,不影响),
而且使用标记为 INTERNAL 的接口感觉不太稳妥 :disappointed_relieved:

我所反应的问题,除了感觉不方便之外,
感觉运算步骤有些多,如果有游戏的核心逻辑需要频繁 setRotation
不知道会不会带来性能问题(自答:那就用 rotationY 就好了嘛 :unamused:)。
总感觉是可以简化的。

你好 我正在处理这个事情
如果你想继续使用rotationY,目前你可以在engine中定制CCNode.js
在rotationY的实现中 在此处插入这句代码

this._fromEuler();
警告暂时可以忽视
或者通过设置eulerAngles
##eulerAngles 参数类型为 Vec3 ,node.eulerAngles = cc.v3(x, y, z);

忽略警告的话

我们只用从这样:

if (this.m_stNode.rotationY != iNewRotationY) {
this.m_stNode.rotationY = iNewRotationY;
}

改成这样就好了:

this.m_stNode.is3DNode = true; // 加上这句就好了

… // 其他的巴拉巴拉代码

// 下面的就不需要改动了
if (this.m_stNode.rotationY != iNewRotationY) {
this.m_stNode.rotationY = iNewRotationY;
}

加上那句 this._fromEuler(); 是干啥的?有bug?
前面不是有 math.quat.fromEuler 在修改 this._quat 了吗 :hushed:

这招儿可以!:grin:
但也需要将当前节点的 is3DNode 设为 true
(当然,还是要自己搞个临时变量,cc.v3() 每次都是 new 一个新对象出来的。

// 以下算是内心OS
cocos2d-js-for-preview.js 里面看到 eulerAngles 是有 get set 方法的
(但是 CCNode.js 里却没有,因为啥就不清除了),
get 方法不是直接拿的 this._eulerAngles,而是返回一个从 this._quat 转换过来的新的对象,
这也是为什么 node.eulerAngles.y = newY 不能更改 node.eulerAngles 的原因。

另外,2.1.0 的 creator.d.ts 里 setRotation 的 y、z、w 参数应该是可选的,
cc.v3 也丢失了…

我也关注下这个问题,
虽然目前是用2D的,但是总是会升到2.1以后的版本

如果不自定引擎的话,
不晓得能不能直接对 cc.node 的prototype做hack?

在版本2.1.1 beta7里面直接 this.node.eulerAngles = cc.v3(x, y, z);来旋转模型,无需加入其它方法。

2赞

现在 V2.1.1 版本水平翻转180度应该咋写呀?

V 2.0.9 的时候我使用的代码

 var rotationTo = cc.rotateTo(0.5, 0, 180);
 node.runAction(rotationTo);

在 V2.1 失效了,并报警告,提示使用 eulerAngles,文档上也没相关使用说明