cocos2d-x의 Sprite3D로 3D 모델의 회전축 변경

9362 단어 C++블렌더cocos2d-x
cocos2d-x 3.1에서 구현 된 Sprite3D를 사용하여 우연히 발견 된 광적인 발견을 공유

3DSprite



예를 들어, 기어와 같은 모델을 표시하고 회전시키고 싶습니다.

모형은 Blender에서 창조했다.


Size visibleSize = Director::getInstance()->getVisibleSize();

auto gear = Sprite3D::create("model/gear.obj");
gear->setPosition(visibleSize.width / 2.0, visibleSize.height / 2.0);
auto rotation = RotateBy::create(10, Vec3(0, 360, 0));
gear->runAction(RepeatForever::create(rotation));
this->addChild(gear);

잘 회전하다

문제: 기울어진 모델을 회전시키면 축이 이상해집니다.



그러나, 이대로라면 보기 좋지 않기 때문에, 재밌게 기어를 기울여 회전하도록 하고 싶다.

그쪽이 입체감이 나와 멋지다.
Size visibleSize = Director::getInstance()->getVisibleSize();

auto gear = Sprite3D::create("model/gear.obj");
gear->setPosition(visibleSize.width / 2.0, visibleSize.height / 2.0);

// X軸、Z軸に対して30度ずつ回転
gear->setRotation3D(Vec3(30, 0, 30));

auto rotation = RotateBy::create(10, Vec3(0, 360, 0));
gear->runAction(RepeatForever::create(rotation));
this->addChild(gear);



돌지만 아무래도 회전축이 이상하다!

모델 자체의 Y축이 아니라 절대 좌표의 Y축이 회전축으로 사용되어 버린 것 같은 거동을 한다. 이것이 아니야!

해결책



안의 코드 봐, 어떻게든 해결하지 않을까나, PR 보낼까라고 생각하고 있었습니다만, 좀처럼 손에 지지 않고.
이것은 어려운 문제라고 생각했고, 의외로 간단한 방법으로 해결했다.
Size visibleSize = Director::getInstance()->getVisibleSize();

auto gear = Sprite3D::create("model/gear.obj");

// 空の親ノードを作る
auto wrapper = Node::create();    
wrapper->setPosition(visibleSize.width / 2.0, visibleSize.height / 2.0);

// 親ノードを回転させる
wrapper->setRotation3D(Vec3(30, 0, 30));

auto rotation = RotateBy::create(10, Vec3(0, 360, 0));
// 回転アニメーションは歯車に付ける
gear->runAction(RepeatForever::create(rotation));

wrapper->addChild(gear);
this->addChild(wrapper);


잘 갔다!

빈 노드를 만들고, 그 쪽을 회전시킨 후, 자식 노드에 회전 애니메이션을 적응시키면 잘 했다.

Unity등으로 잘 하는, Empty GameObject로 모델을 랩 해 회전시키는, 같은 테크닉이 거의 그대로 사용할 수 있는 것 같다.position3D 이나 rotation3D 는, 왜인가 Sprite3D 는 아니고 Node 의 메소드가 되어 있었던 것은 이런 일이었던 것일까.

아무래도 좋지만, cocos2d::Sprite3D 같은 네임스페이스 기분 나쁘네요. 3D 기능이 충실하면 분리되는 것인가······.

좋은 웹페이지 즐겨찾기