茶壶在触摸机制下旋转的三种方式

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();
}



转载于:https://www.cnblogs.com/Anzhongliu/p/6091800.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MagicTools引擎,包括3d场景,材质,d3d与opengles两个渲染器,max导出插件,集成了cocos2d作为ui。 引擎架构如下: 1.MtFoundation:底层数学库、字符串处理、操作系统和编译器宏定义等底层封装库。这些功能放在了MtFoundation.dll中,这个库可以以后单独提取出来提供其他项目使用。 2.MtKernel:提供资源管理器、文件系统、场景树管理。所以资源均提供引用计数、加载卸载计数、资源可以按组进行预加载。同一资源可以属于多个资源组,资源组在做rpg游戏切换房间的时候比较有用,可将一个房间的资源列表做一个组进行加载,若已存在的资源会增加其加载计数,而不用重新加载。 3.MtSceneQuery:场景查询模块。场景查询是一个相对独立的模块,可以替换掉。主要做一些算法的工作,比如射线查询、视锥剔除。把它独立处理就是希望这些cpu计算工作可以与渲染分离,便于放到一个独立的线程中。 4.MtGraphic:3d引擎模块,提供网格定义、材质定义,骨骼动画和蒙皮、贴图资源、渲染设备封装等。此处对渲染设备功能做了抽象,将具体渲染调用放到了d3d9renderer和glesrenderer中去。这里的材质在d3d下直接使用d3dxeffect,并使用宏控制编译。gles下使用固定管线控制。 d3d环境下定义了自己的材质和材质模板格式,材质模板主要用于定义effect中可用的宏,这些宏的可选取值,effect代码本身等。材质文件则引用材质模板文件,并定义宏的取值,还有uniform参数值。图形模块提供effect的uniform参数与场景中光源和物体本身材质参数的绑定。 gles环境下定了一个简单的脚本,控制固定功能渲染中的diffuse、specular和第一层纹理的参数 自定义了模型网格、骨骼、动画、材质、渲染实体等文件格式,这些文件格式说明放在了fileformats目录下。 渲染实体(Model)定义了网格与材质的组合关系,目前一个子网格只能有一个材质,但能扩展成一个子网格绑定多个材质。这样可以方便制作材质的过渡效果。 5.MtGraphic2d:这个模块是将cocos2dx0.99.4的底层替换成自己封装的渲染器实现的。cocos2dx原本是使用opengles1.0作为渲染api,在windows系统下使用powervr的模拟器运行。现在可以在d3d下或是opengles下运行。并将其更新流程合并到MtGraphic中,使得cocos2d可以正常的渲染在3d场景的前方。cocos2d的大部分功能已测试完成。可以在d3d下正常运行。 6.MtEngine:对上面几个模块的统一封装,这里负责动态的加载上面的几个模块,这里可以选择使用d3d还是gles进行渲染。还提供了建议场景逻辑控制,支持加载一个xml定义的场景脚本文件。直接使用EgnObject(EngineObject的简写)对场景模型进行控制可以省去操作底层场景树和模型材质创建的流程。 7.sampler:测试项目,用于测试上述功能。加载一个xml场景(里面全是茶壶。。。等编辑器出来就可以摆场景了),cocos2d界面渲染。鼠标键盘的输入控制。(wasd控制移动、鼠标控制方向) 材质文件说明: efm(effect material):d3d专用,里面会引用mtpl(material template)文件。 mtpl:材质模板文件,里面定义可选的宏和可选取值,还有d3dxeffect的代码。 ffm(fixed function material):d3d和gles通用,固定渲染管线材质。gles下只能用这个。 工程里带的导出插件目前只能导出网格,材质需要自己动手配置.(材质的编辑打算放到编辑器里做,然后在编辑器中绑定网格和材质,这也是cryengine和《古域》的做法,这样可以保证编辑的材质和游戏最终运行时的效果一样。)编译max导出插件需要max2010的sdk,安装插件后就可以导出单个模型。一次导出一个模型,做好一个mesh后选择max的export菜单,然后选择导出成“MtEngine Mesh File”(*.mmesh)就可以。 写了这么最后解释下为啥做这个东西吧。之前在做了两年多ogre引擎的开发,ogre确实很牛x,它的代码风格、封装程度、还有大量的算法工具都很不错,降低了3d开发的门槛,在用过的引擎中它门槛是最低的,说明他的封装做的好,但其内部结构过于复杂,不适合做灵活的修改。比如一个entity只能给一个材质,材质缺乏层的概念,不利于叠加临时效果。渲染与场景管理的代码结合得太紧,不能分离。比如没渲染一次场景都得做一次renderable排序加一次八叉树遍历,一帧里的多次渲染按理这些流程应该有所优化,但ogre
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值