示例#1
0
void initGame(){

	//----light
	{
		light0=new Cc3dLight();
		light0->autorelease();
		light0->retain();
		light0->setPos(100,50,20);
		light0->setAmbient(0.5,0.5,0.5);
	}
	 //----camera2D
    {
        float left=0;
        float right=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getWidth();
        float top=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getHeight();
        float bottom = 0;
        float _near = -1;//note: near and far is key word in vs2010, so here we use _near and _far
        float _far = 1;
        Cc3dRange range(left,right,bottom,top,_near,_far);
        camera2D=new Cc3dCamera();
        camera2D->autorelease();
        camera2D->retain();//must retain
        camera2D->setRange(range);
        camera2D->setProjectionMode(ec3dOrthographicMode);
    }
    //----camera
    {
        camera=new Cc3dCamera();
        camera->autorelease();
        camera->retain();//must retain
        camera->setFovy(70);
        camera->setAspect((float)Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getWidth()/Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getHeight());
        camera->setzNear(0.5);
        camera->setzFar(10000);
        float eyePos[3]={10,5,5};
        float eyeTg[3]={0,0,0};
        float up[3]={0,1,0};
        camera->setEyePos(Cc3dVector3(eyePos).toV4(1));
        camera->setCenter(Cc3dVector3(eyeTg).toV4(1));
        camera->setUp(Cc3dVector3(up).toV4(0));
        camera->updateFrustum();
    }
    //----layer
	Clayer*layer=new Clayer();
	layer->autorelease();
	layer->init();
    layer->setName("layer");
  
 

	//----add to scene
    Cc3dSceneManager::sharedSceneManager()->getRoot()->addChild(layer);
  }
void Cc3dModel::scale_modifyVertexDirectly(float kx,float ky,float kz){//以直接修改顶点的方式进行放缩
    int nMesh=(int)m_meshList.size();
    for(int i=0;i<nMesh;i++){
        int nv=(int)m_meshList[i]->getMeshData()->vlist.size();
        for(int j=0;j<nv;j++){
            Cc3dVertex&v=m_meshList[i]->getMeshData()->vlist[j];
            const Cc3dVector3&pos=v.getPos();
            v.setPos(Cc3dVector3(pos.x()*kx, pos.y()*ky, pos.z()*kz));
        }
    }
}
示例#3
0
void initGame(){
	

	//----light
	{
		light0=new Cc3dLight();
		light0->autorelease();
		light0->retain();
		light0->setPos(200,200,50);
		//light0->setSpecular(0.4,0.4,0.4);
	}
	 //----camera2D
    {
        float left=0;
        float right=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getWidth();
        float top=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getHeight();
        float bottom = 0;
        float _near = -1;//note: near and far is key word in vs2010, so here we use _near and _far
        float _far = 1;
        Cc3dRange range(left,right,bottom,top,_near,_far);
        camera2D=new Cc3dCamera();
        camera2D->autorelease();
        camera2D->retain();//must retain
        camera2D->setRange(range);
        camera2D->setProjectionMode(ec3dOrthographicMode);
    }
    //----camera
    {
        camera=new Cc3dCamera();
        camera->autorelease();
        camera->retain();//must retain
        camera->setFovy(70);
        camera->setAspect((float)Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getWidth()/Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getHeight());
        camera->setzNear(0.5);
        camera->setzFar(10000);
        float eyePos[3]={0,30*1.2,50*1.2};
        float eyeTg[3]={0,0,0};
        float up[3]={0,1,0};
        camera->setEyePos(Cc3dVector3(eyePos).toV4(1));
        camera->setCenter(Cc3dVector3(eyeTg).toV4(1));
        camera->setUp(Cc3dVector3(up).toV4(0));
        camera->updateFrustum();
    }

	//----fbx model
 
    
    Cc3dSkinActor*actor=Cc3dFbxLoader::sharedFbxLoader()->load("fbxLoader_resource/shapeDeformTest/shapeDeformTest_progressive.fbx",1.0f/10);//shapeDeformTest.fbx
    actor->setPos(Cc3dVector4(0,0,0,1));
    actor->setLight(light0);
    actor->setCamera(camera);
    actor->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("classicLighting"));
    actor->setPassUnifoCallback(buildinProgramPassUnifoCallback_classicLighting);
    
    actor->genVBOBuffers();
    actor->submit(GL_STATIC_DRAW);
    
    

    
    //----add to scene
    Cc3dSceneManager::sharedSceneManager()->getRoot()->addChild(actor);

	
}
Cc3dMeshData*genSampleCubeWithCode(float cx,float cy,float cz,float dx,float dy,float dz,
                                   float k_s,
                                   float k_t,
                                   int cubUVMode)
//用代码生成示例立方体
//cx,cy,cz为中心
//dx,dy,dz分别为x,y,z方向上的边心距
{
    Cc3dMeshData*meshData=new Cc3dMeshData();
    meshData->init();
    meshData->autorelease();
    meshData->vlist.reserve(8);
    meshData->IDtriList.reserve(12);
    //----生成顶点数据
    Cc3dVertex tv;
    //前面
    tv.setPos(Cc3dVector3(cx-dx, cy-dy,cz+dz));tv.setTexCoord(Cc3dVector2(0, 0));tv.setNorm(Cc3dVector3(0, 0, 1));//0
    meshData->vlist.push_back(tv);
    tv.setPos(Cc3dVector3(cx+dx, cy-dy,cz+dz));tv.setTexCoord(Cc3dVector2(1, 0));tv.setNorm(Cc3dVector3(0, 0, 1));//1
    meshData->vlist.push_back(tv);
    tv.setPos(Cc3dVector3(cx+dx, cy+dy, cz+dz));tv.setTexCoord(Cc3dVector2(1, 1));tv.setNorm(Cc3dVector3(0, 0, 1));//2
    meshData->vlist.push_back(tv);
    tv.setPos(Cc3dVector3(cx-dx, cy+dy, cz+dz));tv.setTexCoord(Cc3dVector2(0, 1));tv.setNorm(Cc3dVector3(0, 0, 1));//3
    meshData->vlist.push_back(tv);
    //后面
    tv.setPos(Cc3dVector3(cx-dx, cy-dy,cz -dz));tv.setTexCoord(Cc3dVector2(0, 0));tv.setNorm(Cc3dVector3(0, 0, -1));//4
    meshData->vlist.push_back(tv);
    tv.setPos(Cc3dVector3(cx+dx, cy-dy, cz-dz));tv.setTexCoord(Cc3dVector2(1, 0));tv.setNorm(Cc3dVector3(0, 0, -1));//5
    meshData->vlist.push_back(tv);
    tv.setPos(Cc3dVector3(cx+dx, cy+dy, cz-dz));tv.setTexCoord(Cc3dVector2(1, 1));tv.setNorm(Cc3dVector3(0, 0, -1));//6
    meshData->vlist.push_back(tv);
    tv.setPos(cx-dx, cy+dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(0, 0, -1);//7
    meshData->vlist.push_back(tv);
    //上面
    tv.setPos(cx-dx, cy+dy, cz+dz);tv.setTexCoord(0, 0);tv.setNorm(0, 1, 0);//8
    meshData->vlist.push_back(tv);
    tv.setPos(cx+dx, cy+dy, cz+dz);tv.setTexCoord(1, 0);tv.setNorm(0, 1, 0);//9
    meshData->vlist.push_back(tv);
    tv.setPos(cx+dx, cy+dy, cz-dz);tv.setTexCoord(1, 1);tv.setNorm(0, 1, 0);//10
    meshData->vlist.push_back(tv);
    tv.setPos(cx-dx, cy+dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(0, 1, 0);//11
    meshData->vlist.push_back(tv);
    //下面
    tv.setPos(cx-dx, cy-dy, cz+dz);tv.setTexCoord(0, 0);tv.setNorm(0, -1, 0);//12
    meshData->vlist.push_back(tv);
    tv.setPos(cx+dx, cy-dy, cz+dz);tv.setTexCoord(1, 0);tv.setNorm(0, -1, 0);//13
    meshData->vlist.push_back(tv);
    tv.setPos(cx+dx, cy-dy, cz-dz);tv.setTexCoord(1, 1);tv.setNorm(0, -1, 0);//14
    meshData->vlist.push_back(tv);
    tv.setPos(cx-dx, cy-dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(0, -1, 0);//15
    meshData->vlist.push_back(tv);
    //左面
    tv.setPos(cx-dx, cy-dy,cz -dz);tv.setTexCoord(0, 0);tv.setNorm(-1, 0, 0);//16
    meshData->vlist.push_back(tv);
    tv.setPos(cx-dx, cy-dy, cz+dz);tv.setTexCoord(1, 0);tv.setNorm(-1, 0, 0);//17
    meshData->vlist.push_back(tv);
    tv.setPos(cx-dx, cy+dy, cz+dz);tv.setTexCoord(1, 1);tv.setNorm(-1, 0, 0);//18
    meshData->vlist.push_back(tv);
    tv.setPos(cx-dx, cy+dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(-1, 0, 0);//19
    meshData->vlist.push_back(tv);
    //右面
    tv.setPos(cx+dx, cy-dy, cz-dz);tv.setTexCoord(0, 0);tv.setNorm(1, 0, 0);//20
    meshData->vlist.push_back(tv);
    tv.setPos(cx+dx, cy-dy,cz+ dz);tv.setTexCoord(1, 0);tv.setNorm(1, 0, 0);//21
    meshData->vlist.push_back(tv);
    tv.setPos(cx+dx, cy+dy, cz+dz);tv.setTexCoord(1, 1);tv.setNorm(1, 0, 0);//22
    meshData->vlist.push_back(tv);
    tv.setPos(cx+dx, cy+dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(1, 0, 0);//23
    meshData->vlist.push_back(tv);
    //----生成索引三角形
    Cc3dIDTriangle tIDtri;
    //前面
    tIDtri.setvID(0, 1, 2);
    meshData->IDtriList.push_back(tIDtri);
    tIDtri.setvID(0, 2, 3);
    meshData->IDtriList.push_back(tIDtri);
    //后面
    tIDtri.setvID(4, 6, 5);
    meshData->IDtriList.push_back(tIDtri);
    tIDtri.setvID(4, 7, 6);
    meshData->IDtriList.push_back(tIDtri);
    //上面
    tIDtri.setvID(8, 9, 10);
    meshData->IDtriList.push_back(tIDtri);
    tIDtri.setvID(8, 10, 11);
    meshData->IDtriList.push_back(tIDtri);
    //下面
    tIDtri.setvID(12, 14, 13);
    meshData->IDtriList.push_back(tIDtri);
    tIDtri.setvID(12, 15, 14);
    meshData->IDtriList.push_back(tIDtri);
    //左面
    tIDtri.setvID(16, 17, 18);
    meshData->IDtriList.push_back(tIDtri);
    tIDtri.setvID(16, 18, 19);
    meshData->IDtriList.push_back(tIDtri);
    //右面
    tIDtri.setvID(20, 22, 21);
    meshData->IDtriList.push_back(tIDtri);
    tIDtri.setvID(20, 23, 22);
    meshData->IDtriList.push_back(tIDtri);
    //----重新计算各三角形各顶点的uv
    int nv=(int)meshData->vlist.size();
    vector<bool> markList(nv);//标记各顶点是否已经重计算过uv,避免多次计算(多次计算可能导致出错),初始全0
    int nIDtri=(int)meshData->IDtriList.size();
    for(int i=0;i<nIDtri;i++){
        Cc3dIDTriangle&IDtri=meshData->IDtriList[i];
        //重新计算IDtri各顶点的uv
        switch(cubUVMode)
        {
            case cubUVMode_FITFACE:
            {
                //将IDtri中未mark的顶点的uv分别乘以k_s,k_t
                for(int j=0;j<3;j++){
                    int vID=IDtri.vID[j];//顶点号
                    if(markList[vID]==false){//未计算过
                        //重新计算
                        Cc3dVertex&v=meshData->vlist[vID];
                        Cc3dVector2 texCoord=v.getTexCoord();
                        texCoord.setx(texCoord.x()*k_s);
                        texCoord.sety(texCoord.y()*k_t);
                        v.setTexCoord(texCoord);
                        markList[vID]=true;//标记为已计算
                    }
                }
            }break;
            case cubUVMode_UNIFORM:
            {
                //将IDtri各顶点的uv,重新按顶点坐标来计算,并以k_s,k_t放缩
                //判断IDtri的类型
                const int type_LR=0;//左或右
                const int type_UD=1;//上或下
                const int type_FB=2;//前或后
                int type=0;
                Cc3dVector3 norm=meshData->vlist[IDtri.vID[0]].getNorm();
                if(fabsf(fabsf(norm.x())-1)<0.01){//左面或右面
                    type=type_LR;
                }else if(fabsf(fabsf(norm.y())-1)<0.01){//上面或下面
                    type=type_UD;
                }else{//前面或后面
                    type=type_FB;
                }//得到type
                for(int j=0;j<3;j++){
                    int vID=IDtri.vID[j];//顶点号
                    if(markList[vID]==false){//未计算过
                        //重新计算
                        Cc3dVertex&v=meshData->vlist[vID];
                        switch (type) {
                            case type_LR:{
                                //用yz
                                Cc3dVector2 texCoord(v.getPos().y()*k_s,v.getPos().z()*k_t);
                                v.setTexCoord(texCoord);
                            }break;
                            case type_UD:{
                                //用xz
                                Cc3dVector2 texCoord(v.getPos().x()*k_s,v.getPos().z()*k_t);
                                v.setTexCoord(texCoord);
                            }break;
                            case type_FB:{
                                //用xy
                                Cc3dVector2 texCoord(v.getPos().x()*k_s,v.getPos().y()*k_t);
                                v.setTexCoord(texCoord);
                            }break;
                        }
                        //标记为已计算
                        markList[vID]=true;
                    }
                }
            }break;
            default:
                cout<<"error:未知的cubUV映射类型!"<<endl;
                assert(false);
                break;
        }
        
        
    }
    return meshData;
    
}
Cc3dVector3 Cc3dVector2::toV3(float z)const{
    return Cc3dVector3(x(),y(),z);
}
Cc3dVector3 Cc3dVector4::toV3()const{
    return Cc3dVector3(x(),y(),z());
}
示例#7
0
void initGame(){
	Cc3dRect screenRect=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect();

	//----light
	{
		light0=new Cc3dLight();
		light0->autorelease();
		light0->retain();
		light0->setPos(1000,5000,1000);//(50,200,500);
		light0->setSpecular(0.4,0.4,0.4);
	}
	 //----camera2D
    {
        float left=0;
        float right=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getWidth();
        float top=Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getHeight();
        float bottom = 0;
        float _near = -1;//note: near and far is key word in vs2010, so here we use _near and _far
        float _far = 1;
        Cc3dRange range(left,right,bottom,top,_near,_far);
        camera2D=new Cc3dCamera();
        camera2D->autorelease();
        camera2D->retain();//must retain
        camera2D->setRange(range);
        camera2D->setProjectionMode(ec3dOrthographicMode);
    }
    //----camera
    {
        camera=new Cc3dCamera();
        camera->autorelease();
        camera->retain();//must retain
        camera->setFovy(70);
        camera->setAspect((float)Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getWidth()/Cc3dDeviceAndOSInfo::sharedDeviceAndOSInfo()->getScreenRect().getHeight());
        camera->setzNear(0.5);
        camera->setzFar(10000);
        float eyePos[3]={0,30,50};
        float eyeTg[3]={0,30,0};
        float up[3]={0,1,0};
        camera->setEyePos(Cc3dVector3(eyePos).toV4(1));
        camera->setCenter(Cc3dVector3(eyeTg).toV4(1));
        camera->setUp(Cc3dVector3(up).toV4(0));
        camera->updateFrustum();
    }

	//load fbx
	string fbxFilePath="fbxLoader_resource/girl/girl.fbx";
	float aniFrameInterval=1.0f/10;//1.0f/25;//frame interval value we want (second)
	Cc3dSkinActor*actor=Cc3dFbxLoader::sharedFbxLoader()->load(fbxFilePath.c_str(),aniFrameInterval);
	//actor is just for export, no need to fully set up and add to scene
	// actor->setPos(Cc3dVector4(0,0,0,1));
	// actor->setLight(light0);
    // actor->setCamera(camera);
	// actor->setProgram(Cc3dProgramCache::sharedProgramCache()->getProgramByName("classicLighting"));
    // actor->setPassUnifoCallback(buildinProgramPassUnifoCallback_classicLighting);
    // actor->genVBOBuffers();
 	// actor->submit(GL_STATIC_DRAW);
	// Cc3dSceneManager::sharedSceneManager()->getRoot()->addChild(actor);

	//export to my own format
	//do not use girl.cfc (do not use dot in folderName), because it can cause getFullPath fail on iOS(on iOS, the getFullPath function is not implemented very well)
	//export values only
	{
#if (C3D_TARGET_PLATFORM == C3D_PLATFORM_WIN32) 
		string exportPath="export/girl_cfc";
#elif (C3D_TARGET_PLATFORM == C3D_PLATFORM_IOS) 
		string exportPath=Cc3dDocuments::sharedDocuments()->getDocumentsPath()+"/export/girl_cfc";
#else
		assert(false);
#endif
		bool valueOnly=true;//export values only. small, but not very readable.
		cout<<"export values only..."<<endl;
		actor->doExport(exportPath,valueOnly);
		cout<<"export done! model has exported to:"<<exportPath<<endl;
	}
	//export values and keys
	{
#if (C3D_TARGET_PLATFORM == C3D_PLATFORM_WIN32) 
		string exportPath="export/girl_readable_cfc";
#elif (C3D_TARGET_PLATFORM == C3D_PLATFORM_IOS) 
		string exportPath=Cc3dDocuments::sharedDocuments()->getDocumentsPath()+"/export/girl_readable_cfc";
#else
		assert(false);
#endif
		
		bool valueOnly=false;//export values and keys. big, but more readable. 
		cout<<"export values and keys..."<<endl;
		actor->doExport(exportPath,valueOnly);
		cout<<"export done! model has exported to:"<<exportPath<<endl;
	}

	//text
	Cboard*text=new Cboard();
	text->init(240,30,"exportFbxToMyOwnFormat_resource/text.png");
	text->setPos(Cc3dVector4((screenRect.getMinX()+screenRect.getMaxX())/2,(screenRect.getMinY()+screenRect.getMaxY())/2,0,1));
	text->setLight(light0);
    text->setCamera(camera2D);
	text->genVBOBuffers();
	text->submit(GL_STATIC_DRAW);
	//text add to scene
	Cc3dSceneManager::sharedSceneManager()->getRoot()->addChild(text);
}