日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Cocos2d-x 3.x 圖形學渲染系列十

Cocos2d-x 3.x 圖形學渲染系列十

來源:程序員人生   發布時間:2017-03-08 08:57:36 閱讀次數:4559次

筆者介紹:姜雪偉IT公司技術合伙人,IT高級講師,CSDN社區專家,特邀編輯,暢銷書作者,國家專利發明人;已出版書籍:《手把手教你架構3D游戲引擎》電子工業出版社和《Unity3D實戰核心技術詳解》電子工業出版社等。

每一個3D引擎都有對外提供的接口類,這個類主要是用于創建掛接場景中的所有物體,構成場景的樹狀結構。在Cocos2D-x引擎中,2d使用的是Sprite類在3D塊中為了辨別2D的Sprite類,新增加了Sprite3D類。該類是用于掛接場景中的3D物體,3D游戲場景中物體組織是樹狀結構,在邏輯編寫中使用的非常多。首先開發者要用Sprite3D類對象創建場景中的物體,3D場景中的物體都是Sprite3D精靈,引擎要做的第1件事情是創建精靈,實現的函數內容以下所示

Sprite3D* Sprite3D::create(const std::string& modelPath)
{
	CCASSERT(modelPath.length() >= 4, "invalid filename for Sprite3D");

	auto sprite = new (std::nothrow) Sprite3D();
	if (sprite && sprite->initWithFile(modelPath))
    {
        sprite->_contentSize = sprite->getBoundingBox().size;
        sprite->autorelease();
		return sprite;
    }
	CC_SAFE_DELETE(sprite);
	return nullptr;
}
Sprite3D* Sprite3D::create(const std::string& modelPath, const std::string& texturePath)
{
	auto sprite = create(modelPath);
	if (sprite)
    {
        sprite->setTexture(texturePath);
    }

	return sprite;
}

create函數在創建模型時常常用到,創建出可顯示的模型,第1個函數的參數是模型的加載路徑,第2個函數是模型的加載路徑和紋理貼圖名字,可更換模型貼圖材質。后面會用案例給讀者介紹,在上面的函數中提供了初始化模型文件信息函數initWithFile以下所示:

bool Sprite3D::initWithFile(const std::string& path)
{
	_aabbDirty = true;
	_meshes.clear();
	_meshVertexDatas.clear();
	CC_SAFE_RELEASE_NULL(_skeleton);
	removeAllAttachNode();

	if (loadFromCache(path))
		return true;

	MeshDatas* meshdatas = new (std::nothrow) MeshDatas();
	MaterialDatas* materialdatas = new (std::nothrow) MaterialDatas();
	NodeDatas* nodeDatas = new (std::nothrow) NodeDatas();
	if (loadFromFile(path, nodeDatas, meshdatas, materialdatas))
{
		if (initFrom(*nodeDatas, *meshdatas, *materialdatas))
        {
			//加到緩存
			auto data = new (std::nothrow) Sprite3DCache::Sprite3DData();
            data->materialdatas = materialdatas;
            data->nodedatas = nodeDatas;
            data->meshVertexDatas = _meshVertexDatas;
			for (const auto mesh :_meshes) {
                data->glProgramStates.pushBack(mesh->getGLProgramState());
            }

			Sprite3DCache::getInstance()->addSprite3DData(path, data);
			CC_SAFE_DELETE(meshdatas);
			_contentSize = getBoundingBox().size;
			return true;
        }
    }
		CC_SAFE_DELETE(meshdatas);
		CC_SAFE_DELETE(materialdatas);
		CC_SAFE_DELETE(nodeDatas);

		return false;
}

initWithFile函數是引擎提供的加載模型對外接口,函數功能是實現了加載模型信息比如:材質信息,模型數據信息等。在加載模型之前需要先申請寄存模型頂點數據信息,材質信息,模型的結點信息,這些信息具體實現是在loadFromFile函數中實現的,函數以下所示:

bool Sprite3D::loadFromFile(const std::string& path, NodeDatas* nodedatas, MeshDatas* meshdatas,  MaterialDatas* materialdatas)
{
	std::string fullPath = FileUtils::getInstance()->fullPathForFilename(path);

	std::string ext = FileUtils::getInstance()->getFileExtension(path);
	if (ext == ".obj")
    {
		return Bundle3D::loadObj(*meshdatas, *materialdatas, *nodedatas, fullPath);
    }
	else if (ext == ".c3b" || ext == ".c3t")
    {
		//加載模型文件 .c3b 或 .c3t
		auto bundle = Bundle3D::createBundle();
		if(!bundle->load(fullPath))
        {
			Bundle3D::destroyBundle(bundle);
			return false;
        }

		auto ret = bundle->loadMeshDatas(*meshdatas)
		&& bundle->loadMaterials(*materialdatas) &&		bundle->loadNodes(*nodedatas);
		Bundle3D::destroyBundle(bundle);

		return ret;
    }
	return false;
}

loadFromFile函數提供了加載Cocos2d-x引擎支持的3類模型:obj模型,c3t模型,c3b模型,以c3b或c3t為例,模型文件是2進制和json文件,數據的加載是在Bundle3D類實現的,調用的接口是load函數,函數接口實現以下:

bool Bundle3D::load(const std::string& path)
{
	if (path.empty())
			return false;

	if (_path == path)
		return true;

	getModelRelativePath(path);

	bool ret = false;
	std::string ext = FileUtils::getInstance()->getFileExtension(path);
	if (ext == ".c3t")
    {
		_isBinary = false;
        ret = loadJson(path);
    }
	else if (ext == ".c3b")
    {
		_isBinary = true;
        ret = loadBinary(path);
    }
	else
    {
		CCLOG("warning: %s is invalid file formate", path.c_str());
    }

    ret?(_path = path):(_path = "");

	return ret;
}

load函數實現的是利用Bundle3D類提供的加載函數讀取模型文件內容,這樣利用Sprite3D類提供的接口就能夠把模型加載顯示出來。

以上展現的函數,開發者在編寫邏輯時常常調用到,固然Sprite3D不但只是提供這幾個函數接口。在后面的章節中會詳細給讀者講授。下面通過案例給讀者展示如何使用Sprite3D的接口加載模型的代碼片斷:

Sprite3DForceDepthTest::Sprite3DForceDepthTest()
{
	auto orc = cocos2d::Sprite3D::create("Sprite3DTest/orc.c3b");
    orc->setScale(5);
    orc->setNormalizedPosition(Vec2(.5f,.3f));
    orc->setPositionZ(40);
    orc->setRotation3D(Vec3(0,180,0));
    orc->setGlobalZOrder(⑴);

	addChild(orc);

	auto ship = Sprite3D::create("Sprite3DTest/boss1.obj");
    ship->setScale(5);
    ship->setTexture("Sprite3DTest/boss.png");
    ship->setNormalizedPosition(Vec2(.5,.5));
    ship->setRotation3D(Vec3(90,0,0));
    ship->setForceDepthWrite(true);

	addChild(ship);
}

Sprite3DForceDepthTest函數中首先調用Sprite3D的接口create函數創建出模型,創建出的模型在場景中是沒法顯示出來的,接下來設置它的大小、位置、旋轉角度和設置它的Z深度值,目的是設置場景中的模型層次關系或說是遮擋關系,這樣多個模型顯示時才有會有前后關系。這些參數設置好了后,最后的工作是將模型在場景中顯示出來,顯示模型需要將模型掛接到場景中作為場景的孩子結點,換句話說就是將模型結點加入到場景樹中,調用函數addchild既可實現。在場景中實現的效果以下圖:



Cocos2D-x引擎中凡是觸及到創建模型對象都會與Sprite3D精靈有關系。


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 狠狠亚洲 | 欧美精品一区二区三区四区五区 | 国产一区二区精品久久 | 欧美精品在线免费观看 | 在线地址一地址二免费看 | 欧美在线视频网站 | 色姑娘天天综合网 | 韩国三级视频 | 日韩中文字幕av | 欧美午夜精品一区二区三区电影 | 国产黄色免费网站 | 欧美韩日一区 | 亚洲高清福利 | 精品视频免费看 | 国产精品久久久久一区二区 | 国产免费小视频 | 99视频在线 | 国产成人精品一区二区三区四区 | 欧洲精品码一区二区三区免费看 | 精品国产91乱码一区二区三区 | 欧美日韩中文字幕在线 | 日韩精品免费一区二区在线观看 | 国产午夜精品一区二区 | 99热| 国产日本亚洲 | 高潮白浆女日韩av免费看 | 亚洲一区网站 | 精品久久久久久久人人人人传媒 | 日韩中文字幕在线免费观看 | 国产亚洲网站 | 成人黄色在线观看 | 国产精品成人一区二区三区 | 日韩在线视频观看 | 久久免费国产 | 久草在线免费福利 | 一区二区福利视频 | 国产精品久久久久久久久久不蜜月 | 国产精品污 | 中文字幕在线三区 | 国产精品精品视频 | 黄色网av |