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