int main() { IrrlichtDevice *device = createDevice( video::EDT_OPENGL, dimension2d<u32>(800, 600)); IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); smgr->addCameraSceneNode(0, vector3df(0,10,-10), vector3df(0,5,0)); IAnimatedMesh* mesh = smgr->getMesh("ninja.b3d"); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh); node->setMaterialFlag(EMF_LIGHTING, false); node->setMaterialTexture( 0, driver->getTexture("nskinrd.jpg") ); node->setRotation(vector3df(0,180,0)); // let ninja be in front to us node->setJointMode(EJUOR_CONTROL); // tell irrlicht that you want to control joint positions IBoneSceneNode* bone = node->getJointNode("Joint10"); // create IBoneSceneNode and select the desired bone while(device->run()) { bone->setRotation(bone->getRotation() + vector3df(1,0,0)); // rotate bone driver->beginScene(); smgr->drawAll(); driver->endScene(); } device->drop(); return 0; }
void MovimentadorPernaDireita::mover(irr::scene::IAnimatedMeshSceneNode * node,tipos::Esqueleto esqueleto) { std::string coxa_esquerda_bone = "UpLeg_L"; std::string perna_esquerda_bone = "LoLeg_L"; std::string pe_esquerdo_bone_1 = "Foot_L"; std::string pe_esquerdo_bone_2 = "Toe_L"; tipos::Vetor v3_ = Vetor(esqueleto.joelho_esquerdo.x,esqueleto.abdomen.y); Vetor p1_ = esqueleto.abdomen; Vetor p2_ = esqueleto.joelho_esquerdo; Vetor p3_ = v3_; float a1_ = CalculosUteis::anguloEntrePontos(p1_,p2_,p3_); if(!_isnan(a1_)) setarAnguloBone(node,coxa_esquerda_bone,-90 + a1_); //setarAnguloPerna(node,coxa_direita_bone,90-a1_); float angulo_joelho = CalculosUteis::anguloEntrePontos(esqueleto.joelho_esquerdo,esqueleto.abdomen,esqueleto.pe_esquerdo); if(!_isnan(angulo_joelho)) { setarAnguloPerna(node,perna_esquerda_bone, angulo_joelho); IBoneSceneNode * joelho = node->getJointNode(perna_esquerda_bone.c_str()); core::vector3df rot= joelho->getRotation(); //rot.Y = angulo_joelho; rot.Z = 180; joelho->setRotation(rot); } // IBoneSceneNode * pe_1 = node->getJointNode(pe_esquerdo_bone_1.c_str()); IBoneSceneNode * pe_2 = node->getJointNode(pe_esquerdo_bone_2.c_str()); pos_1 = Vetor(pe_1->getAbsolutePosition().X,pe_1->getAbsolutePosition().Y,pe_1->getAbsolutePosition().Z); pos_2 = Vetor(pe_2->getAbsolutePosition().X,pe_2->getAbsolutePosition().Y,pe_2->getAbsolutePosition().Z); /* bool tem = false; for(int i=0;i<marcadores.size();i++) { if( ( (marcadores[i]->pontoDentroMarcador(pos_1)) || (marcadores[i]->pontoDentroMarcador(pos_2)) ) && i!=indiceAnterior) { if(!cronometro.iniciado()) { cronometro.iniciarContagem(); } tem = true; indiceAtual = i; } } if(!tem) { cronometro.pararContagem(); } */ }
void MovimentadorMembro::setarAnguloPerna(IAnimatedMeshSceneNode * node,std::string nome_bone,float angulo) { std::string pe_esquerdo_bone = "Foot_L"; std::string coxa_direita_bone = "UpLeg_R"; std::string coxa_esquerda_bone = "UpLeg_L"; std::string perna_esquerda_bone = "LoLeg_L"; IBoneSceneNode * coxaDir = node->getJointNode(coxa_direita_bone.c_str()); if(coxaDir) { irr::core::vector3df rot = coxaDir->getRotation(); rot.Z = 0; coxaDir->setRotation(rot); } IBoneSceneNode * coxaEsq = node->getJointNode(coxa_esquerda_bone.c_str()); if(coxaEsq) { irr::core::vector3df rot = coxaEsq->getRotation(); rot.Z = 0; coxaEsq->setRotation(rot); } IBoneSceneNode * bone = node->getJointNode(nome_bone.c_str()); if(bone) { vector3df rot = bone->getRotation(); rot.Y = angulo; bone->setRotation(rot); } }
void MovimentadorMembro::setarAnguloBone(IAnimatedMeshSceneNode * node, std::string nome_bone,float angulo) { IBoneSceneNode * bone = node->getJointNode(nome_bone.c_str()); if(bone) { core::vector3df rot = bone->getRotation(); rot.Y = angulo; bone->setRotation(rot); } }
void world_avatar::initialize() { core::vector3df targetPos(3000, 0, 3000); ISceneManager *sceneManager = device_->getSceneManager(); IVideoDriver *driver = device_->getVideoDriver(); camera_ = sceneManager->addCameraSceneNode(0); camera_->setPosition(core::vector3df(2700 * 2, 200, 2600 * 2)); camera_->setTarget(targetPos); camera_->setFarValue(42000.0f); mesh_ = device_->getSceneManager()->getMesh("data/assets/Skeleton.Male.x"); meshNode_ = device_->getSceneManager()->addAnimatedMeshSceneNode(mesh_); meshNode_->setAnimationSpeed(30); meshNode_->setMaterialFlag(video::EMF_LIGHTING, false); meshNode_->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, false); meshNode_->setDebugDataVisible(scene::EDS_OFF); meshNode_->setScale(core::vector3df(200,200,200)); meshNode_->setPosition(targetPos); //core::quaternion q; //q.fromAngleAxis(90 * core::DEGTORAD, core::vector3df(1, 0, 0)); //core::matrix4 m1 = q.getMatrix(); //meshNode_->updateAbsolutePosition(); //core::matrix4 m2 = meshNode_->getAbsoluteTransformation(); //core::matrix4 m = m1*m2; //meshNode_->setRotation(m.getRotationDegrees()); ITexture* test = driver->getTexture("data/assets/upper-body.png"); meshNode_->getMaterial(0).TextureLayer[0].Texture = test; ITexture* test2 = driver->getTexture("data/assets/lower-body.png"); meshNode_->getMaterial(1).TextureLayer[0].Texture = test2; ITexture* test3 = driver->getTexture("data/assets/head.png"); meshNode_->getMaterial(2).TextureLayer[0].Texture = test3; //meshNode_->setJointMode(EJUOR_CONTROL); IBoneSceneNode* rightUpperArm = meshNode_->getJointNode((u32)0); core::vector3df cpos = rightUpperArm->getRotation(); cpos.Z -= 1.5; rightUpperArm->setRotation(cpos); }
TransformadorAtualizarPosicaoBracoDireito::TransformadorAtualizarPosicaoBracoDireito(IAnimatedMeshSceneNode * node) { TransformadorAtualizarPosicaoBracoDireito::primeiro = true; TransformadorAtualizarPosicaoBracoDireito::node = node; esqueletoRef.abdomen = Vetor( node->getJointNode("Root")->getAbsolutePosition().X , node->getJointNode("Root")->getAbsolutePosition().Y, node->getJointNode("Root")->getAbsolutePosition().Z); esqueletoRef.ombro_direito = Vetor( node->getJointNode("UpArm_R")->getAbsolutePosition().X , node->getJointNode("UpArm_R")->getAbsolutePosition().Y, node->getJointNode("UpArm_R")->getAbsolutePosition().Z); esqueletoRef.cotovelo_direito = Vetor( node->getJointNode("LoArm_R")->getAbsolutePosition().X , node->getJointNode("LoArm_R")->getAbsolutePosition().Y, node->getJointNode("LoArm_R")->getAbsolutePosition().Z); esqueletoRef.mao_direita = Vetor( node->getJointNode("Hand_R")->getAbsolutePosition().X , node->getJointNode("Hand_R")->getAbsolutePosition().Y, node->getJointNode("Hand_R")->getAbsolutePosition().Z); distanciaCotoveloMao = CalculosUteis::distanciaEntrePontos(esqueletoRef.cotovelo_direito,esqueletoRef.mao_direita); distanciaOmbroCotovelo = CalculosUteis::distanciaEntrePontos(esqueletoRef.ombro_direito,esqueletoRef.cotovelo_direito); IBoneSceneNode * nodeOmbro = node->getJointNode("UpArm_R"); core::vector3df rotOmbro = nodeOmbro->getRotation(); rotOmbro.Y = 0; //nodeOmbro->setRotation(rotOmbro); }
void MovimentadorBracoEsquerdo::mover(irr::scene::IAnimatedMeshSceneNode * node,tipos::Esqueleto esqueleto) { std::string ombro_esquerdo_bone = "UpArm_L"; std::string braco_esquerdo_bone = "LoArm_L"; std::string mao_esquerda_bone = "Index_L"; float anguloOmbroEsquerdo = getAnguloBraco(esqueleto.ombro_esquerdo,esqueleto.cotovelo_esquerdo); setarAnguloBone(node,ombro_esquerdo_bone,-anguloOmbroEsquerdo); float anguloMaoEsquerda = CalculosUteis::anguloEntrePontos(esqueleto.cotovelo_esquerdo,esqueleto.ombro_esquerdo,esqueleto.mao_esquerda); if(esqueleto.cotovelo_esquerdo.y < esqueleto.mao_esquerda.y) anguloMaoEsquerda = - anguloMaoEsquerda; if(!_isnan(anguloMaoEsquerda)) setarAnguloBone(node,braco_esquerdo_bone,anguloMaoEsquerda); IBoneSceneNode * mao = node->getJointNode(mao_esquerda_bone.c_str()); pos = Vetor( mao->getAbsolutePosition().X, mao->getAbsolutePosition().Y, mao->getAbsolutePosition().Z); //teste /* bool tem = false; for(int i=0;i<marcadores.size();i++) { if(marcadores[i]->pontoDentroMarcador(pos) && i!=indiceAnterior) { if(!cronometro.iniciado()) { cronometro.iniciarContagem(); } tem = true; indiceAtual = i; } } if(!tem) { cronometro.pararContagem(); } */ }
void TransformadorAtualizarPosicaoBracoDireito::transformar(irr::scene::IAnimatedMeshSceneNode * node, tipos::Esqueleto esqueleto) { IBoneSceneNode * ombro = node->getJointNode("UpArm_R"); IBoneSceneNode * cotovelo = node->getJointNode("UpArm_R"); float menorDistancia = 999; float anguloOmbro = 0; float anguloCotovelo = 0; //int anguloMinimo = -60; //int anguloMaximo = 60; int anguloMinimoOmbro = ombro->getRotation().Y - 20; int anguloMaximoOmbro = ombro->getRotation().Y + 20; int anguloMinimoCotovelo = cotovelo->getRotation().Y - 20; int anguloMaximoCotovelo = cotovelo->getRotation().Y + 20; for (int i = anguloMinimoOmbro ;i < anguloMaximoOmbro ;i++) { core::vector3df rotOmbro = ombro->getRotation(); rotOmbro.Y = i; ombro->setRotation(rotOmbro); for(int j =anguloMinimoCotovelo ; j< anguloMaximoCotovelo ;j++) { core::vector3df rotCot = cotovelo->getRotation(); rotCot.Y = j; cotovelo->setRotation(rotCot); IBoneSceneNode * mao = node->getJointNode("Hand_R"); node->updateAbsolutePosition(); for(int i=0;i<node->getJointCount();i++) { node->getJointNode(i)->updateAbsolutePosition(); } float distancia = CalculosUteis::distanciaEntrePontos( Vetor(mao->getAbsolutePosition().X,mao->getAbsolutePosition().Y,mao->getAbsolutePosition().Z), esqueletoRef.mao_direita); if(distancia<menorDistancia) { menorDistancia = distancia; anguloOmbro = i; anguloCotovelo = j; } } } printf("i: %f j: %f distancia : %f\n",anguloOmbro,anguloCotovelo,menorDistancia); core::vector3df rotOmbro = ombro->getRotation(); rotOmbro.Y = anguloOmbro; ombro->setRotation(rotOmbro); core::vector3df rotCot = cotovelo->getRotation(); rotCot.Y = anguloCotovelo; cotovelo->setRotation(rotCot); }
void JanelaTesteKinect::desenhar() { Mesh_Info p = char_mesh; if(JanelaTesteKinect::primeiro) { camera = //SceneManager->addCameraSceneNode(0,core::vector3df(30,0,123),core::vector3df(30,0,0)); SceneManager->addCameraSceneNodeFPS(); camera->setPosition(core::vector3df(30,0,123)); camera->setTarget(core::vector3df(30,0,0)); //char_mesh.arquivo="modelos/dwarf.x"; // char_mesh.arquivo="modelos/personagem/Bonecos definitivos 23-09-2013/professor2/professor.b3d"; mesh = SceneManager->getMesh(char_mesh.arquivo.c_str()); if(mesh) { SceneManager->addLightSceneNode(0, core::vector3df(0,0,0), video::SColorf(1.0f, 0.6f, 0.7f, 1.0f), 600.0f); node = SceneManager->addAnimatedMeshSceneNode(mesh); JanelaTesteKinect::sensor->iniciar(); node->setPosition(core::vector3df(30,0,-10)); node->setRotation(core::vector3df(p.rotacao.x,p.rotacao.y,p.rotacao.z)); node->addShadowVolumeSceneNode(); SceneManager->setShadowColor(video::SColor(220,0,0,0)); node->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); //node->setScale(core::vector3df(p.escala.x,p.escala.y,p.escala.z)); node->setScale(core::vector3df(10,10,10)); //node->setScale(core::vector3df(100,100,100)); node->setVisible(true); node->setMaterialFlag(EMF_LIGHTING, true); //node->setMaterialFlag(E_MATERIAL_FLAG::EMF_NORMALIZE_NORMALS,true); //node->setAutomaticCulling(false); //node->setAutomaticCulling(EAC_FRUSTUM_SPHERE); //node->setMaterialTexture(1,SceneManager->getVideoDriver()->getTexture("modelos/personagem/crianca1/textures/texture.png")); //JanelaEscolhaPersonagem::nodes.push_back(node); //int matNum = node->getMaterialCount(); //SMaterial mat = node->getMaterial(0); //node->setJointMode(irr::scene::E_JOINT_UPDATE_ON_RENDER::EJUOR_CONTROL); std::string mao_esquerda_bone_teste = "Foot_R"; std::string ombro_esquerd_bone_teste = "UpLeg_R"; std::string braco_esqerdo_bone_teste = "LoLeg_R"; irr::scene::IBoneSceneNode * mao = node->getJointNode(mao_esquerda_bone_teste.c_str()); irr::scene::IBoneSceneNode * cotovelo = node->getJointNode(braco_esqerdo_bone_teste.c_str()); irr::scene::IBoneSceneNode * ombro = node->getJointNode(ombro_esquerd_bone_teste.c_str()); irr::core::vector3df rot = ombro->getRotation(); irr::core::vector3df rot2 = cotovelo->getRotation(); rot.Y = 90; rot.Z = 0; ombro->setRotation(rot); /*********************/ irr::scene::IBoneSceneNode * cotovelo_2 = node->getJointNode("LoLeg_L"); irr::scene::IBoneSceneNode * ombro_2 = node->getJointNode("UpLeg_L"); irr::core::vector3df rot_ = ombro_2->getRotation(); irr::core::vector3df rot2_ = cotovelo_2->getRotation(); rot_.Y = -90; rot_.Z = 0; ombro_2->setRotation(rot_); node->setJointMode(EJUOR_CONTROL); mesh->drop(); avatar = new Avatar(SceneManager,char_mesh,vector<MarcadorPedra*>()); avatar->setNode(node); } JanelaTesteKinect::primeiro = false; Esqueleto e1; e1.ombro_direito.x=1; e1.ombro_direito.y=1; e1.ombro_direito.z=1; e1.cotovelo_direito.x=3; e1.cotovelo_direito.y=3; e1.cotovelo_direito.z=1; e1.mao_direita.x = 4; e1.mao_direita.y = 2; e1.mao_direita.z = 0; e1.ombro_esquerdo.x=-1; e1.ombro_esquerdo.y=-1; e1.ombro_esquerdo.z=-1; e1.cotovelo_esquerdo.x=-3; e1.cotovelo_esquerdo.y=-3; e1.cotovelo_esquerdo.z=-1; e1.mao_esquerda.x = -4; e1.mao_esquerda.y = -2; e1.mao_esquerda.z = 0; /*----------------------------*/ Esqueleto e2; e2.ombro_direito.x=1; e2.ombro_direito.y=1; e2.ombro_direito.z=1; e2.cotovelo_direito.x=2; e2.cotovelo_direito.y=3; e2.cotovelo_direito.z=1; e2.mao_direita.x = 4; e2.mao_direita.y = 2; e2.mao_direita.z = 0; e2.ombro_esquerdo.x=1; e2.ombro_esquerdo.y=1; e2.ombro_esquerdo.z=1; e2.cotovelo_esquerdo.x=3; e2.cotovelo_esquerdo.y=3; e2.cotovelo_esquerdo.z=1; e2.mao_esquerda.x = 4; e2.mao_esquerda.y = 2; e2.mao_esquerda.z = 0; /*--------------------------------*/ Esqueleto e3; e3.ombro_direito.x=1; e3.ombro_direito.y=1; e3.ombro_direito.z=1; e3.cotovelo_direito.x=1; e3.cotovelo_direito.y=3; e3.cotovelo_direito.z=1; e3.mao_direita.x = 4; e3.mao_direita.y = 2; e3.mao_direita.z = 0; e3.ombro_esquerdo.x=1; e3.ombro_esquerdo.y=1; e3.ombro_esquerdo.z=1; e3.cotovelo_esquerdo.x=3; e3.cotovelo_esquerdo.y=3; e3.cotovelo_esquerdo.z=1; e3.mao_esquerda.x = 4; e3.mao_esquerda.y = 2; e3.mao_esquerda.z = 0; esqueletos.push_back(e1); esqueletos.push_back(e2); esqueletos.push_back(e3); FILE * file = NULL; fopen_s(&file,"bones.txt","w+t"); for(int i=0;i<node->getJointCount();i++) { IBoneSceneNode * bone = node->getJointNode(i); //bone->setSkinningSpace(irr::scene::E_BONE_SKINNING_SPACE::EBSS_LOCAL); fprintf_s(file,"%d %s\n",i,bone->getName()); } fclose(file); } else{ //bool usarKinect = true; bool usarKinectOuArquivo = false; bool usarKinect = false; bool salvarNoArquivo = true; bool usarArquivo = ! usarKinect && usarKinectOuArquivo; bool testeSubir = true; //bool aquelaClasse = true; // node->setRotation(core::vector3df(180,180,0)); if(usarKinect) { JanelaTesteKinect::sensor->processar(); if(JanelaTesteKinect::sensor->getUsuariosAtivos()>0){ //printf("capturado\n"); Esqueleto esqueleto = JanelaTesteKinect::sensor->capturar(); avatar->atualizarPosicao(esqueleto); boneco->setEsqueleto(esqueleto); boneco->desenhar(SceneManager->getVideoDriver()); if(salvarNoArquivo) { bool comIntervalo = false; if(comIntervalo) { /* if(!cronometro.iniciado()) cronometro.iniciarContagem(); if(cronometro.getTempoCorridoSegundos()==2){ atualizaPosBoneco(esqueleto); cronometro.pararContagem(); } */ } else { atualizaPosBoneco(esqueleto); } } } } if(usarArquivo) { vector<Esqueleto> esqueletos = JanelaTesteKinect::lerDoArquivo(); bool comTempo = false; //i=495; //i=10; //i=180; Esqueleto esqueleto = esqueletos[i]; if(!cronometro.iniciado()) cronometro.iniciarContagem(); if(comTempo) { if(cronometro.getTempoCorridoSegundos()==2){ //atualizaPosBoneco(esqueleto); esqueleto=boneco->ajustarEsqueleto(esqueleto); esqueleto=boneco->ajustarEsqueleto(esqueleto); boneco->setEsqueleto(esqueleto); avatar->atualizarPosicao(esqueleto); cronometro.pararContagem(); printf("i = %d\n",i); i++; if(i==esqueletos.size()) i=0; } }else{ //atualizaPosBoneco(esqueleto); //esqueleto = moverBonecoProLado(esqueleto); esqueleto=boneco->ajustarEsqueleto(esqueleto); esqueleto=boneco->ajustarEsqueleto(esqueleto); boneco->setEsqueleto(esqueleto); avatar->atualizarPosicao(esqueleto); boneco->desenhar(SceneManager->getVideoDriver()); //cronometro.pararContagem(); printf("i = %d\n",i); i++; if(i==esqueletos.size()) i=0; } } if(testeSubir) { if(!cronometroParaSubir.iniciado()) cronometroParaSubir.iniciarContagem(); if(cronometroParaSubir.getTempoCorridoMiliSegundos() >= 100) { cronometroParaSubir.reiniciarContagem(); if(indiceSubir<50) { if(subir) { avatar->subirPersonagem(1); }else { avatar->subirPersonagem(-1); } }else { indiceSubir = 0; subir= !subir; } indiceSubir++; } } } /* irr::scene::IBoneSceneNode * bone_braco = node->getJointNode("Scene_root_LoArm_L"); vector3df rot = bone_braco->getRotation(); rot.X+=10; bone_braco->setRotation(rot); if(!cronometro.iniciado()) cronometro.iniciarContagem(); if(cronometro.getTempoCorridoSegundos()==2){ avatar->atualizarPosicao(esqueletos[i]); i++; if(i==esqueletos.size()) i=0; cronometro.pararContagem(); }*/ }