zoukankan      html  css  js  c++  java
  • 茶壶在触摸机制下旋转的三种方式

    1、旋转摄像机,使摄像机围绕茶壶旋转,达到茶壶自转的效果!

    2、旋转环境光,

    3、旋转物体自身,直接使茶壶自转。


    .h文件

    #ifndef __HELLOWORLD_SCENE_H__
    #define __HELLOWORLD_SCENE_H__
    
    #include "cocos2d.h"
    USING_NS_CC;
    class HelloWorld : public cocos2d::Layer
    {
    public:
        static cocos2d::Scene* createScene();
        virtual bool init();  
    	virtual void onEnter();
    	virtual void onExit();
        CREATE_FUNC(HelloWorld);
    	Sprite3D * pSprite3D;
    	Camera* pCamera;
    	Camera* pCamera01;
    	//GLProgramState* state;
    	void onTouchesBegan(const std::vector<Touch*>& touches, cocos2d::Event  *event);
    	void onTouchesMoved(const std::vector<Touch*>& touches, cocos2d::Event  *event);
    	void onTouchesEnded(const std::vector<Touch*>& touches, cocos2d::Event  *event);
    	float m_fAngle;
    };
    
    #endif // __HELLOWORLD_SCENE_H__
    

    .cpp文件

    #include "HelloWorldScene.h"
    #include "DrawNode3D.h"
    
    
    
    Scene* HelloWorld::createScene()
    {
        // 'scene' is an autorelease object
        auto scene = Scene::create();
        
        // 'layer' is an autorelease object
        auto layer = HelloWorld::create();
    
        // add layer as a child to scene
        scene->addChild(layer);
    
        // return the scene
        return scene;
    }
    
    // on "init" you need to initialize your instance
    bool HelloWorld::init()
    {
        if (!Layer::init())
        {
            return false;
        }
    	////////////////
    	Size size = Director::getInstance()->getWinSize();
    	pCamera01 = Camera::createPerspective(30.0f, size.width / size.height, 1.0f, 1000);//(60.0f, size.width / size.height, 0.1f, 1000)
    	pCamera01->setCameraFlag(CameraFlag::USER1);
    	pCamera01->setPosition3D(Vec3(size.width / 2, size.height / 2, 0.0f));
    	//m_pCamera->lookAt(Vec3(20, 200, 0));//(480, 320, 0))
    	pCamera01->lookAt(Vec3(0,0, 0), Vec3(0.0f, 1.0f, 0.0f));
    	this->addChild(pCamera01);
    	//创建茶壶模型
    		pSprite3D = Sprite3D::create("teapot.c3b");
    		pSprite3D->setPosition3D(Vec3(0, 0, 0));
    	pSprite3D->setRotation3D(Vec3(-90, 0,0));
    	pSprite3D->setScale(12.0f);
    	pSprite3D->setCameraMask(2);
    	this->addChild(pSprite3D);
    
    	///////
    	m_fAngle = 1.0f;//一定要赋初始值,否则旋转不了!
    	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);
    	return true;
    }
    
    void HelloWorld::onEnter()
    {
    	Layer::onEnter();
    	
    	auto	pGLProgram = GLProgram::createWithFilenames("Diffuse.vsh", "Diffuse.fsh");
    	auto	state = GLProgramState::create(pGLProgram);
    
    	long offset = 0;
    	auto attributeCount = pSprite3D->getMesh()->getMeshVertexAttribCount();
    	for (int k = 0; k < attributeCount; k++)
    	{
    		auto meshattribute = pSprite3D->getMesh()->getMeshVertexAttribute(k);
    		state->setVertexAttribPointer(
    			s_attributeNames[meshattribute.vertexAttrib],
    			meshattribute.size,
    			meshattribute.type,
    			GL_FALSE,
    			pSprite3D->getMesh()->getVertexSizeInBytes(),
    			(GLvoid*)offset
    			);
    
    		offset += meshattribute.attribSizeBytes;
    	}
    	Camera*		pCamera = Director::getInstance()->getRunningScene()->getDefaultCamera();
    	Vec3		pos = pCamera->getPosition3D();
    	Vec3		target = Vec3(-10, -10, -10);//(480, 320, 0);
    
    	state->setUniformVec3("v_eyepos", pos - target);
    
    	pSprite3D->setGLProgramState(state);
    
    
    }
    void HelloWorld::onTouchesBegan(const std::vector<Touch*>& touches, cocos2d::Event  *event)
    {
    
    }
    
    void HelloWorld::onTouchesMoved(const std::vector<Touch*>& touches, cocos2d::Event  *event)
    {
    	if (touches.size())
    	{
    		auto touch = touches[0];
    		auto delta = touch->getDelta();
    		m_fAngle -= CC_DEGREES_TO_RADIANS(delta.x);
    		//pSprite3D->setPosition3D(Vec3(100.0f * sinf(m_fAngle), 15.0f, 100.0f * cosf(m_fAngle)));
    		//pCamera01->setPosition3D(Vec3(100.0f * sinf(m_fAngle), 500.0f, 100.0f * cosf(m_fAngle)));
    		pCamera01->lookAt(Vec3(0, 0, 0), Vec3(0.0f,1.0f, 0.0f));
    
    		pSprite3D->setRotation3D(Vec3(-90.0f, 100.0f * m_fAngle,0.0f ));
    	}
    }
    
    void HelloWorld::onTouchesEnded(const std::vector<Touch*>& touches, cocos2d::Event  *event)
    {
    
    }
    void HelloWorld::onExit()
    {
    	Layer::onExit();
    }



  • 相关阅读:
    C++ Websites
    C++ smart pointer
    Use of ‘const’ in Functions Return Values
    Meaning of “const” last in a C++ method declaration?
    为什么不要使用"using namespace XXX"
    android.os.Handler
    Windows下Anaconda的安装和简单使用
    matlab GPU 操作
    matlab 在柱状图上 显示数字
    How to fix apt-get GPG error NO_PUBKEY Ubuntu 14
  • 原文地址:https://www.cnblogs.com/Anzhongliu/p/6091800.html
Copyright © 2011-2022 走看看