i try to make simple as in the NavMeshTest camera rotation on the X around the mesh that in the center ( simple cube)
taking the NavMeshTest.cpp example i implemented it like this :
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
_angle = 0.0f;
auto floor = cocos2d::Sprite3D::create("models/converted/floor.c3b");
floor->setScale(20);
floor->setNormalizedPosition(Vec2(.5f, .3f));
floor->setPositionZ(-120);
floor->setRotation3D(Vec3(50, 180, 0));
floor->setGlobalZOrder(-1);
this->addChild(floor);
auto robo = cocos2d::Sprite3D::create("models/converted/robo.c3b");
robo->setScale(20);
robo->setNormalizedPosition(Vec2(.5f, .3f));
robo->setPositionZ(-20);
robo->setRotation3D(Vec3(50, 0, 180));
robo->setGlobalZOrder(-1);
this->addChild(robo);
_camera = Camera::createPerspective(60, visibleSize.width / visibleSize.height, 10, 1000);
_camera->setPosition3D(Vec3(0.0f, 50.0f, 100.0f));
_camera->lookAt(Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f));
_camera->setCameraFlag(CameraFlag::USER1);
this->addChild(_camera);
auto listener = EventListenerTouchAllAtOnce::create();
listener->onTouchesBegan = CC_CALLBACK_2(HelloWorld::onTouchesBegan, this);
listener->onTouchesMoved = CC_CALLBACK_2(HelloWorld::onTouchesMoved, this);
listener->onTouchesEnded = CC_CALLBACK_2(HelloWorld::onTouchesEnded, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
scheduleUpdate();
return true;
}
void HelloWorld::onTouchesBegan(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event)
{
touchesBegan(touches, event);
}
void HelloWorld::onTouchesMoved(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event)
{
if (touches.size() && _camera)
{
auto touch = touches[0];
auto delta = touch->getDelta();
_angle -= CC_DEGREES_TO_RADIANS(delta.x);
CCLOGWARN("_angle:%f", _angle);
_camera->setPosition3D(Vec3(100.0f * sinf(_angle), 50.0f, 100.0f * cosf(_angle)));
CCLOGWARN("100.0f * sinf(_angle):%f", (100.0f * sinf(_angle)));
_camera->lookAt(Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, 1.0f, 0.0f));
}
touchesMoved(touches, event);
}
void HelloWorld::onTouchesEnded(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event)
{
touchesEnded(touches, event);
}
void HelloWorld::touchesEnded(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event)
{
if (!touches.empty()){
auto touch = touches[0];
auto location = touch->getLocationInView();
Vec3 nearP(location.x, location.y, 0.0f), farP(location.x, location.y, 1.0f);
auto size = Director::getInstance()->getWinSize();
_camera->unproject(size, &nearP, &nearP);
_camera->unproject(size, &farP, &farP);
}
}
void HelloWorld::update(float delta)
{
}
the problem is that the camera is not moving Or at list i dont see any effect in the rendered screen when i move the mouse right or left .
the print log of the engine do print me changing values so i know there is somekind of movement
HelloWorld::onTouchesMoved : _angle:-0.069697
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-6.964058
HelloWorld::onTouchesMoved : _angle:-0.139396
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-13.894519
HelloWorld::onTouchesMoved : _angle:-0.174243
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-17.336277
HelloWorld::onTouchesMoved : _angle:-0.226516
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-22.458406
HelloWorld::onTouchesMoved : _angle:-0.296215
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-29.190248
HelloWorld::onTouchesMoved : _angle:-0.400766
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-39.012398
HelloWorld::onTouchesMoved : _angle:-0.487887
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-46.876030
HelloWorld::onTouchesMoved : _angle:-0.627285
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-58.694851
HelloWorld::onTouchesMoved : _angle:-0.766683
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-69.375008
HelloWorld::onTouchesMoved : _angle:-0.923502
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-79.771843
HelloWorld::onTouchesMoved : _angle:-1.097752
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-89.018555
HelloWorld::onTouchesMoved : _angle:-1.254571
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-95.041618
HelloWorld::onTouchesMoved : _angle:-1.428817
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-98.993782
HelloWorld::onTouchesMoved : _angle:-1.620488
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-99.876556
HelloWorld::onTouchesMoved : _angle:-1.759886
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-98.217575
HelloWorld::onTouchesMoved : _angle:-1.916710
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-94.076591
HelloWorld::onTouchesMoved : _angle:-2.056103
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-88.453171
HelloWorld::onTouchesMoved : _angle:-2.195502
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-81.113541
HelloWorld::onTouchesMoved : _angle:-2.300048
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-74.567329
HelloWorld::onTouchesMoved : _angle:-2.422020
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-65.906319
HelloWorld::onTouchesMoved : _angle:-2.526571
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-57.697617
HelloWorld::onTouchesMoved : _angle:-2.718242
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-41.081722
HelloWorld::onTouchesMoved : _angle:-2.909913
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-22.961233
HelloWorld::onTouchesMoved : _angle:-3.084159
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):-5.740242
HelloWorld::onTouchesMoved : _angle:-3.171279
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):2.968218
HelloWorld::onTouchesMoved : _angle:-3.240983
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):9.922632
HelloWorld::onTouchesMoved : _angle:-3.345529
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):20.252573
HelloWorld::onTouchesMoved : _angle:-3.415228
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):27.023298
HelloWorld::onTouchesMoved : _angle:-3.467501
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):32.016960
HelloWorld::onTouchesMoved : _angle:-3.519774
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):36.923115
HelloWorld::onTouchesMoved : _angle:-3.554621
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):40.138508
HelloWorld::onTouchesMoved : _angle:-3.589473
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):43.305595
HelloWorld::onTouchesMoved : _angle:-3.624321
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):46.419704
HelloWorld::onTouchesMoved : _angle:-3.641747
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):47.956055
HelloWorld::onTouchesMoved : _angle:-3.641747
HelloWorld::onTouchesMoved : 100.0f * sinf(_angle):47.956055
what am i missing here ?
also when i look at the Camera3DTests.cpp example
i see differnte method to rotate camera am talking on line 123
_lis->onTouchMoved = [this](Touch* t, Event* e) {
float dx = t->getDelta().x;
Vec3 rot = _camControlNode->getRotation3D();
rot.y += dx;
_camControlNode->setRotation3D(rot);
Vec3 worldPos;
_camNode->getNodeToWorldTransform().getTranslation(&worldPos);
Camera::getDefaultCamera()->setPosition3D(worldPos);
Camera::getDefaultCamera()->lookAt(_camControlNode->getPosition3D());
};
and line 58 that build some kind of node relationship
_camControlNode = Node::create();
_camControlNode->setNormalizedPosition(Vec2(.5,.5));
addChild(_camControlNode);
_camNode = Node::create();
_camNode->setPositionZ(Camera::getDefaultCamera()->getPosition3D().z);
_camControlNode->addChild(_camNode);
so what is the right way ?