18-07-2010 20:05:07
- mr.xyz
- Membres
- Date d'inscription:
- Messages: 15
- IP: 92.162.79.79
- Courriel
Bonjour,
Pour gérer les collisions, j'affiche le hittriangle ( le triangle en collision avec mon mesh) en rouge via la fonction draw3DTriangle (comme le tuto 7 officiel). Au début sa marchait bien, mais depuis hier les triangles sont complètement transparents, sans couleur, ils ne s'affichent que pendant que je bouge la caméra, alors que le code n'a pas changé je pense :s ... (j'ai restesté avec le tuto officiel, et la sa marche, donc je ne comprend vraiment plus rien) Merci d'avance, si vous souhaitez que je poste du code ya pas de soucis
!
Hors ligne
18-07-2010 20:43:34
- nabouill
- Membres

- Date d'inscription:
- Messages: 242
- IP: 79.92.234.161
- Courriel
Salut
si vous souhaitez que je poste du code ya pas de soucis
ouais ce serait pas mal, sinon comment veut tu, car là par rapport a ce que tu dit, ça ne peut venir que d'un problème de code (enfin je pense
Hors ligne
18-07-2010 23:10:56
- mr.xyz
- Membres
- Date d'inscription:
- Messages: 15
- IP: 92.162.79.79
- Courriel
Voila le main :
Code c++ :
int main()
{
int lastFPS = -1;
int windowW = 640;//important de stocker la taille de la fenetre dans des variable pour positionner le curseur
int windowH = 480;
float init_ant_posX=1000.f;
float init_ant_posZ=2000.f;
// Fenetre
SIrrlichtCreationParameters params;
params.AntiAlias = 2;
params.Bits = 16;
params.Fullscreen = false;
params.WindowSize = dimension2d<u32>(windowW, windowH);
params.DriverType = video::EDT_OPENGL;
IrrlichtDevice* device = createDeviceEx(params);
// Driver
video::IVideoDriver* driver = device->getVideoDriver ();
driver->setFog(video::SColor(0, 200, 170, 120), video::EFT_FOG_LINEAR, 4000.0f, 12000.0f, 0.03f, false, false);
// Scene Manager
scene::ISceneManager *sceneManager = device->getSceneManager ();
sceneManager->setAmbientLight(video::SColorf(1.0, 1.0, 1.0f, 0.0f));
// Curseur
device->getCursorControl ()-> setVisible (false);
// Terrain
scene::ITerrainSceneNode* terrain = sceneManager->addTerrainSceneNode(
"heightmap.bmp", // heightmap
0, // parent node
IDFlag_IsPickable, // ID
core::vector3df(0.f, 0.f, 0.f), // position
core::vector3df(0.f, 0.f, 0.f), // rotation
core::vector3df(40.f, 4.4f, 40.f), // scale
video::SColor ( 255, 255, 255, 255 ), // vertexColor,
5, // maxLOD
scene::ETPS_17, // patchSize
100 // smoothFactor
);
terrain->setMaterialFlag(video::EMF_LIGHTING, false); // Lumiere
terrain->setMaterialFlag(video::EMF_FOG_ENABLE, true);
terrain->setMaterialTexture(0, driver->getTexture("texture.bmp")); // Texture
terrain->setMaterialTexture(1, driver->getTexture("detailmap.jpg"));
terrain->setMaterialType(video::EMT_DETAIL_MAP); // Type de material
terrain->scaleTexture(1.0f, 20.0f); // Scale texture
// Création du selector du terrain
scene::ITriangleSelector* selector = sceneManager->createTerrainTriangleSelector(terrain, 0);
terrain->setTriangleSelector(selector);
// Skybox
sceneManager->addSkyBoxSceneNode(
driver->getTexture("irrlicht2_up.jpg"),
driver->getTexture("irrlicht2_dn.jpg"),
driver->getTexture("irrlicht2_lf.jpg"),
driver->getTexture("irrlicht2_rt.jpg"),
driver->getTexture("irrlicht2_ft.jpg"),
driver->getTexture("irrlicht2_bk.jpg"));
// Fourmi
float antScale = 2.0f;
scene::IAnimatedMesh* model = sceneManager->getMesh("formica rufa.3ds");
scene::IAnimatedMeshSceneNode* Nmodel = sceneManager->addAnimatedMeshSceneNode(model);
Nmodel->setFrameLoop(1, 310);
Nmodel->setScale(core::vector3df(antScale,antScale,antScale));
Nmodel->setMaterialFlag(video::EMF_LIGHTING, false);
Nmodel->setMaterialTexture(0,driver->getTexture("texture.jpg") );
Nmodel->setPosition(core::vector3df(init_ant_posX,terrain->getHeight(init_ant_posX,init_ant_posZ),init_ant_posZ));
Nmodel->setID(IDFlag_IsPickable);
core::aabbox3df boundingBox = Nmodel->getBoundingBox();
core::vector3df extent = boundingBox.getExtent();
show3dVector("Taille de la foumi: ",extent);
selector->drop();
// Arbre
float treeScale = 300.f;
scene::IMesh* tree = sceneManager->getMesh("Tree/DG_Tree.obj");
scene::IMeshSceneNode* Ntree = sceneManager->addMeshSceneNode(tree);
Ntree->setScale(core::vector3df(treeScale,treeScale,treeScale));
Ntree->setMaterialFlag(video::EMF_LIGHTING, false);
Ntree->getMaterial(1).setTexture(0,driver->getTexture("Tree/Leaf.png"));
Ntree->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
Ntree->setPosition(core::vector3df(2000.f,0.f,2000.f));
Ntree->setID(ID_IsNotPickable);
// Selector de l'arbre
scene::ITriangleSelector* selector2 = sceneManager->createTriangleSelector(tree,Ntree);
Ntree->setTriangleSelector(selector2);
// Création de l'animator et l'attache au mesh de la fourmi
scene::ISceneNodeAnimator* anim = sceneManager->createCollisionResponseAnimator(
selector2, Nmodel, extent,
core::vector3df(0,0,0));
selector2->drop();
Nmodel->addAnimator(anim);
anim->drop();
// Camera
SKeyMap keyMap[4];
keyMap[0].Action = EKA_MOVE_FORWARD;
keyMap[0].KeyCode = KEY_UP;
keyMap[1].Action = EKA_MOVE_BACKWARD;
keyMap[1].KeyCode = KEY_DOWN;
keyMap[2].Action = EKA_STRAFE_LEFT;
keyMap[2].KeyCode = KEY_LEFT;
keyMap[3].Action = EKA_STRAFE_RIGHT;
keyMap[3].KeyCode = KEY_RIGHT;
scene::ICameraSceneNode *camera;
float speed=0.03f;
camera = sceneManager->addCameraSceneNodeFPS (0,50.0f, speed, ID_IsNotPickable, keyMap, 5, true, 0.4);
camera->setPosition(core::vector3df(init_ant_posX, terrain->getHeight(init_ant_posX,init_ant_posZ) + CEventManager::CameraHeightOnTerrain, init_ant_posZ));
camera->setTarget(Nmodel->getPosition());
camera->setFarValue(15000.0f); // horizon
// Mouvement du model
CEventManager mManager(driver,sceneManager,Nmodel,terrain,camera);
// Evenements
CEventReceiver capteur(device,&mManager); // creation capteur d'events
device->setEventReceiver(&capteur);
// Inclinaison sur le terrain
scene::ISceneCollisionManager* collMan = sceneManager->getSceneCollisionManager();
// Ligne de collision
core::line3df verticalLine;
core::vector3df modelPos;
// Tracks the current intersection point with the level or a mesh
core::vector3df intersection;
// Used to show with triangle has been hit
core::triangle3df hitTriangle;
scene::ISceneNode * selectedSceneNode;
video::SMaterial material;
material.NormalizeNormals = true ;
material.setTexture(0,0);
material.Lighting = false;
int cpt=0;
while (device->run())
{
driver->beginScene(true,true,0);
// Mouvement du model
mManager.moveObjects();
modelPos = Nmodel->getPosition();
verticalLine.start = modelPos;
verticalLine.start.Y += 1000;
core::vector3df endPoint = modelPos;
endPoint.Y -= 1000;
verticalLine.end = endPoint;
selectedSceneNode =
collMan->getSceneNodeAndCollisionPointFromRay(
verticalLine,
intersection,
hitTriangle,
IDFlag_IsPickable, // This ensures that only nodes that we have set up to be pickable are considered
0); // Check the entire scene (this is actually the implicit default)
if(selectedSceneNode != 0)
{
driver->setMaterial(material);
driver->setTransform(video::ETS_WORLD, core::matrix4());
driver->draw3DTriangle(hitTriangle, video::SColor(255,255,0,0));
core::vector3df normal = hitTriangle.getNormal().normalize();
core::vector3df newModelRotation = Nmodel->getRotation();
// Inclinaison en X
float cosX = normal.dotProduct(core::vector3df(1,0,0));
float angleX = acos(cosX);
//cout<<"angleX: "<<angleX<<endl;
// Inclinaison en Z
float cosZ = normal.dotProduct(core::vector3df(0,0,1));
float angleZ = acos(cosZ);
//cout<<"angleZ: "<<angleZ<<endl;
newModelRotation.X = angleX;
newModelRotation.Z = angleZ;
Nmodel->setRotation(newModelRotation);
//show3dVector("Normale: ",hitTriangle.getNormal());
//show3dVector("Normale normalisee: ",normal);
}
// Affichage
sceneManager->drawAll();
driver->endScene();
int fps = driver->getFPS();
if (lastFPS != fps)
{
core::stringw str = L"3DAntSimulator - Irrlicht Engine [";
str += driver->getName();
str += "] FPS:";
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
device->sleep(25);
}
device->drop();
return 0;
}
Hors ligne
21-07-2010 15:46:44
29-07-2010 16:04:43
- mr.xyz
- Membres
- Date d'inscription:
- Messages: 15
- IP: 86.221.78.151
- Courriel
Désolé j'aime pas trop up mais bon..
Je ne trouve toujours pas de solution, j'ai beau changer la couleur tu triangle affiché, il reste transparent, pour n'importe quelle valeur
Hors ligne
29-07-2010 20:26:21
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
tu dit avoire essayer de changer la couleur mais le premier truc que je regarde et je voie << video::SColor(255,255,0,0) >> ... pour moi c'est claire tu essaye d'afficher un triangler avec l'alpha à 100% transparent essaye plutot avec 255,255,0,255 ...
SColor est en mode rgba et non argb ... tu était au courrant au moin ? ou alors tu croyais que l'alpha a 0 = pas de transparence ...
ah et ses mieux si tu affiche ton triangle après le rendue de ta scene, sa se veras mieux s'il se superpose << sceneManager->drawAll(); >> tu le mais avans ta condition
Hors ligne
29-07-2010 22:26:00
- mr.xyz
- Membres
- Date d'inscription:
- Messages: 15
- IP: 86.221.78.151
- Courriel
Merci beaucoup, il fallait en effet afficher le triangle après l'affichage de la scene (il me semblait avoir testé cette solution pourtant). Par contre (c'est peut être une différence de version à voir) moi c'est bien argb. Et oui je m'étais trompé en metant 0 pour la transparence
Merci beaucoup en tout cas même si je pouvais avancer sur mon projet je m'obstinais à résoudre ce problème et tu me permets d'avancer maintenant. Encore merci ![]()
Hors ligne
29-07-2010 23:42:22
- Magun
- Administrateurs

- Date d'inscription:
- Messages: 910
- IP: 188.93.45.30
- Courriel Site web
euh oui argb ... dsl j'ai confondue avec mon moteur 3d ...
Hors ligne



