多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > 綜合技術(shù) > Cocos2d-x 3.x 圖形學(xué)渲染系列十

Cocos2d-x 3.x 圖形學(xué)渲染系列十

來源:程序員人生   發(fā)布時間:2017-03-08 08:57:36 閱讀次數(shù):4549次

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

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

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函數(shù)在創(chuàng)建模型時常常用到,創(chuàng)建出可顯示的模型,第1個函數(shù)的參數(shù)是模型的加載路徑,第2個函數(shù)是模型的加載路徑和紋理貼圖名字,可更換模型貼圖材質(zhì)。后面會用案例給讀者介紹,在上面的函數(shù)中提供了初始化模型文件信息函數(shù)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函數(shù)是引擎提供的加載模型對外接口,函數(shù)功能是實現(xiàn)了加載模型信息比如:材質(zhì)信息,模型數(shù)據(jù)信息等。在加載模型之前需要先申請寄存模型頂點數(shù)據(jù)信息,材質(zhì)信息,模型的結(jié)點信息,這些信息具體實現(xiàn)是在loadFromFile函數(shù)中實現(xiàn)的,函數(shù)以下所示:

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函數(shù)提供了加載Cocos2d-x引擎支持的3類模型:obj模型,c3t模型,c3b模型,以c3b或c3t為例,模型文件是2進制和json文件,數(shù)據(jù)的加載是在Bundle3D類實現(xiàn)的,調(diào)用的接口是load函數(shù),函數(shù)接口實現(xiàn)以下:

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函數(shù)實現(xiàn)的是利用Bundle3D類提供的加載函數(shù)讀取模型文件內(nèi)容,這樣利用Sprite3D類提供的接口就能夠把模型加載顯示出來。

以上展現(xiàn)的函數(shù),開發(fā)者在編寫邏輯時常常調(diào)用到,固然Sprite3D不但只是提供這幾個函數(shù)接口。在后面的章節(jié)中會詳細給讀者講授。下面通過案例給讀者展示如何使用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函數(shù)中首先調(diào)用Sprite3D的接口create函數(shù)創(chuàng)建出模型,創(chuàng)建出的模型在場景中是沒法顯示出來的,接下來設(shè)置它的大小、位置、旋轉(zhuǎn)角度和設(shè)置它的Z深度值,目的是設(shè)置場景中的模型層次關(guān)系或說是遮擋關(guān)系,這樣多個模型顯示時才有會有前后關(guān)系。這些參數(shù)設(shè)置好了后,最后的工作是將模型在場景中顯示出來,顯示模型需要將模型掛接到場景中作為場景的孩子結(jié)點,換句話說就是將模型結(jié)點加入到場景樹中,調(diào)用函數(shù)addchild既可實現(xiàn)。在場景中實現(xiàn)的效果以下圖:



Cocos2D-x引擎中凡是觸及到創(chuàng)建模型對象都會與Sprite3D精靈有關(guān)系。


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 在线观看视频在线观看 | 尤物在线 | 亚洲tv精品一区二区三区 | 麻豆影视视频高清在线观看 | 国产精品人人视频 | 日韩第一色| 一本大道香蕉大无线视频 | 一区二区三区在线播放 | 一级做a爰片性色毛片视频图片 | 国产色在线 | 亚洲 国产色综合久久无码有码 国产色综合一区二区三区 国产上床视频 | xxxxx大片在线观看 | 欧美一二 | 久久精品国产主播一区二区 | 日本xxx护士与黑人 日本xxx网站 | yellow中文字幕久久网 | 国产精品亚洲欧美日韩区 | 亚洲黄色在线观看视频 | 韩日一区二区三区 | 一级一级特黄女人精品毛片视频 | 最近中文字幕国语免费高清6 | 国产福利在线免费观看 | 第一国内永久免费福利视频 | 最近免费的中文字幕一 | 欧美日韩在线一区二区三区 | 中文字幕资源站 | 精品一久久香蕉国产二月 | 毛片在线播放观看日本 | 最近手机中文字幕大全4 | 中文字幕在线视频播放 | 激情的网站 | 亚洲黄色自拍 | 中文字幕亚洲色图 | h视频免费高清在线观看 | 五月婷婷综合在线 | 欧美视讯 | 全部无卡免费的毛片在线看 | 亚洲 校园 春色 另类 激情 | 日韩高清一区二区 | 亚洲啪在线 | www.毛片| 亚洲精品国产77777 |