Bonjour à tous,
Je souhaiterai que ma caméra soit attiré au sol
Alors voilà est ce possible de gérer çà sans Newton ou autre moteur physique ?
J'aimerai que ma caméra soit coller au sol donc impossible de voler. Et dans un même temps la possibilité de sauter.
Est ce que Irrlicht sait faire çà ?
Merci de votre aide
Hors ligne
ouaip, regarde la demo technique
tu crée un meta selector:
tu crée un triangle selector par nodes qui seront solide que tu rajoute au metaselector:
tu crée un animator:
que tu rajoute a ta camera:
plus de détaille dans les sources de la demo contenue dans les exemples irrlicht
s'il y a besoin d’approfondissement ... ?
Hors ligne
Bon j'ai essayé ton code,
Ma caméra est collé au sol c'est bon mais si je vise vers le haut, je monte et je décolle du sol.
Comment faire pour éviter çà, impossibilité de se décoller du sol.
PS. Les collisions marchent
Hors ligne
Extrait de la doc:
Donc tu as un paramètre "gravityPerSecond" au lieu de -10, tu mets -100 et tu augmentes jusqu'à ce que tu obtiennes le résultat. Normalement, si ta camera avance de n/seconde ta gravité doit être de -n. Tu as juste à regarder la vitesse d'avance de ta camera (je suppose cameraFPS).
Extrait de la doc :
Le parametre de déplacement est "moveSpeed" donc "gravitypersecond" = vector3df(0,-moveSpeed*1000,0).
Détails du calcul:
movespeed = 0.5f / milliseconde
gravityPerSecond = x / seconde = -movespeed / millisecondes = -movespeed*1000 / secondes
Dernière modification par johnplayer (24-11-2012 13:37:40)
Hors ligne
Merci beaucoup.
Je suis désolé mais mon niveau d'Anglais est tellement faible alors c'est vraiment sympa la traduction
Hors ligne
Voici mon code:
#include <irrlicht.h> using namespace irr; #ifdef _MSC_VER #pragma comment(lib, "Irrlicht.lib") #endif class MyEventReceiver : public IEventReceiver { public: MyEventReceiver(scene::ISceneNode* terrain) : Terrain(terrain) { } bool OnEvent(const SEvent& event) { return false; } private: scene::ISceneNode* Terrain; }; int main() { irr::IrrlichtDevice* device = irr::createDevice(irr::video::EDT_OPENGL, irr::core::dimension2d<irr::u32>(1000,800),32); video::IVideoDriver* driver = device->getVideoDriver(); scene::ISceneManager* scene = device->getSceneManager(); gui::IGUIEnvironment* env = device->getGUIEnvironment(); device->setWindowCaption(L"Fast Jump [INDEV]"); device->getCursorControl()->setVisible(false); irr::SKeyMap keyMap[4]; keyMap[0].Action = irr::EKA_MOVE_FORWARD; keyMap[0].KeyCode = irr::KEY_KEY_Z; keyMap[1].Action = irr::EKA_MOVE_BACKWARD; keyMap[1].KeyCode = irr::KEY_KEY_S; keyMap[2].Action = irr::EKA_STRAFE_LEFT; keyMap[2].KeyCode = irr::KEY_KEY_Q; keyMap[3].Action = irr::EKA_STRAFE_RIGHT; keyMap[3].KeyCode = irr::KEY_KEY_D; scene::ICameraSceneNode* camera = scene->addCameraSceneNodeFPS(0,100.0f,2.5f, -1, keyMap, 4); camera->setPosition(core::vector3df(2700*2,255*2,2600*2)); camera->setTarget(core::vector3df(2397*2,343*2,2700*2)); camera->setFarValue(42000.0f); scene::ITerrainSceneNode* terrain = scene->addTerrainSceneNode("heightmap.png", 0, -1, core::vector3df(0.f, 0.f, 0.f), core::vector3df(0.f, 0.f, 0.f), core::vector3df(60.f, 10.f, 60.f), video::SColor ( 255, 255, 255, 255 ), 5, scene::ETPS_17, 4); terrain->setMaterialFlag(video::EMF_LIGHTING, false); terrain->setMaterialTexture(0, driver->getTexture("terrain-texture.jpg")); terrain->setMaterialTexture(1, driver->getTexture("detailmap3.jpg")); terrain->setMaterialType(video::EMT_DETAIL_MAP); terrain->scaleTexture(1.0f, 20.0f); // create triangle selector for the terrain scene::ITriangleSelector* selector = scene->createTerrainTriangleSelector(terrain, 0); terrain->setTriangleSelector(selector); // create collision response animator and attach it to the camera scene::ISceneNodeAnimator* anim = scene->createCollisionResponseAnimator( selector, camera, core::vector3df(60,100,60), core::vector3df(0,0,0), core::vector3df(0,50,0)); selector->drop(); camera->addAnimator(anim); anim->drop(); MyEventReceiver receiver(terrain); device->setEventReceiver(&receiver); scene->setAmbientLight(irr::video::SColorf(1.0, 1.0, 1.0,0.0)); while(device->run()) if (device->isWindowActive()) { driver->beginScene(true, true, 0 ); scene->drawAll(); env->drawAll(); driver->endScene(); } device->drop(); return 0; }
Quand je vise avec ma souris vers le haut, je continue à décoller du sol ;(
Hors ligne
et avec le paramaetre noVerticalMovement a true quand tu crée ta camera ?
Hors ligne
je ne sais pas a quoi correspond exactement la paramêtre, mais il me semble suffisament explicite
peut-être qu'il permet de d'ignorer le vectieur verticale et donc d'empecher la camera de "monter" par le biais des touches d'avancement
dans le cadre de ce que tu fait sa n'empeche pas la cameras de bouger sur l'axe verticale étant donenr que la camera suis le terrain
a toi de tester
Hors ligne
C'est excellent, sa marche mais oui y a toujours un "mais" si ma caméra se trouve face à une pente elle monte et du coup bah elle touche plus le sol et à ce moment là je me remet à voler xD
Newton serai pas mieux ? xD
Hors ligne
Le code d'Irrlicht marche très bien, je l'utilise et je n'ai pas de problème. NoVerticalMovement t'empêche de te déplacer sur Y mais ne l'utilise pas tu n'en as pas besoin. Dans ton code que tu as donné au-dessus ta gravité est à zéro.
Ta gravité est réglée sur vector3df(0,0,0) au lieu de vector3df(0,-2500.f,0). (2500.f parce tu as réglé le "moveSpeed" de ta camera à 2.5f)
Vérifie que "ellipsoidRadius" est de la bonne taille et il serait mieux dans un premier temps de mettre "ellipsoidTranslation" à vector3df(0,0,0).
Hors ligne
Alors là MERCI MERCI
Je vous remercie de votre aide, tout marche, quand je suis en descente sa descend enfin normal quoi.
Merci beaucoup
PS. En modifiant les valeurs c'est bon sa descend moi
Dernière modification par Logeur (24-11-2012 21:17:55)
Hors ligne
Bonsoir,
Je viens de refaire mon code pour pouvoir utiliser ma map.
Et là tout bug. La gravité et le saut ont disparus ...
Alors que j'utilise le même code ...
Je désespère petit à petit ;(
#include <irrlicht.h> #include <iostream> using namespace std; using namespace irr; int main() { IrrlichtDevice *device = createDevice(video::EDT_OPENGL, core::dimension2d<u32>(1000,800), 32); video::IVideoDriver *driver = device -> getVideoDriver(); scene::ISceneManager *sceneManager = device -> getSceneManager(); device->setWindowCaption(L"Fast Jump [INDEV]"); device->getCursorControl()->setVisible(false); scene::IAnimatedMesh *map = sceneManager -> getMesh("mapFJ.obj"); scene::ImeshSceneNode *scene = sceneManager -> addMeshSceneNode(map -> getMesh(0)); scene -> setMaterialFlag(video::EMF_LIGHTING,false); scene -> setMaterialTexture(0, driver -> getTexture("terrain-texture.jpg")); sceneManager -> getMeshManipulator() -> makePlanarTextureMapping(map -> getMesh(0), 0.4f); scene::ITriangleSelector *selector = 0; if (scene) { selector = sceneManager->createOctTreeTriangleSelector(map->getMesh(0), scene); scene->setTriangleSelector(selector); selector->drop(); } SKeyMap keyMap[5]; keyMap[0].Action = irr::EKA_MOVE_FORWARD; keyMap[0].KeyCode = irr::KEY_KEY_Z; keyMap[1].Action = irr::EKA_MOVE_BACKWARD; keyMap[1].KeyCode = irr::KEY_KEY_S; keyMap[2].Action = irr::EKA_STRAFE_LEFT; keyMap[2].KeyCode = irr::KEY_KEY_Q; keyMap[3].Action = irr::EKA_STRAFE_RIGHT; keyMap[3].KeyCode = irr::KEY_KEY_D; keyMap[4].Action = EKA_JUMP_UP; keyMap[4].KeyCode = KEY_SPACE; scene::ICameraSceneNode* camera = sceneManager-> addCameraSceneNodeFPS(0,100.0f,0.025f, -1, keyMap, 5, true, 10.5f); camera->setPosition(core::vector3df(0,100,0)); camera->setTarget(core::vector3df(0,0,0)); camera->setFarValue(42000.0f); scene::ISceneNodeAnimator *anim = sceneManager->createCollisionResponseAnimator(selector, camera, core::vector3df(60,100,60), core::vector3df(0,-100,0), core::vector3df(0,50,0)); camera->addAnimator(anim); anim->drop(); while(device -> run()) { driver -> beginScene(true, true, video::SColor(255,90,146,177)); sceneManager -> drawAll(); driver->endScene(); } device -> drop(); return 0; }
Dernière modification par Logeur (27-11-2012 17:52:02)
Hors ligne
De grandes chances qu'il n'ait pas réussi à charger le mesh. Tu ne créé pas le selector si le node "scene" n'est pas créé mais pourtant tu l'autorises à être paramètré?!
Essaies ça déjà:
Hors ligne
J'ai repris ton code mais tjrs le même problème.
Et puis impossible de se déplacer sur toute la carte.
Je vais vite fait faire une vidéo : Voici : http://www.youtube.com/watch?v=nP9n6MOJ … e=youtu.be
Dernière modification par Logeur (27-11-2012 19:46:16)
Hors ligne
Certainement à cause du relief et de ta colision. Vu comment est ton terrain, tu dois rester bloquer entre les obstacles qu'il forme. Essai avec un terrain plat ou au moins avec des obstacles qu'il est possible de franchir avec tes paramètres de collision.
Hors ligne
Mais le problème c'est que j'aimerais garder ce terrain.
Y a pas moyen de faire autrement ?
Hors ligne
Régler tes paramètres! Si le saut ne marche pas c'est que la valeur n'est pas appropriée, peut-être régler slidingvalue et l'ellipsoidradius de ta colision pour franchir plus facilement les obstacles... S'il y a des paramètres dans les fonctions c'est pour ça. Après peut-être quand modélisant ton terrain différemment tu peux faire quelque chose. Mais là je ne sais pas vraiment ce que tu veux donc comment je pourrais te donner une réponse précise?
Hors ligne
J'aimerai faire un petit jeu de saut d'obstacle donc automatiquement je dois avoir des endroits plus hauts que d'autres.
Et puis même avec un terrain plat, je n'ai plus mes sauts et la gravité. ;(
Je suis vraiment désolé de vous embêter avec mes problèmes
Dernière modification par Logeur (27-11-2012 20:43:29)
Hors ligne
Augmentes le paramètre de saut, peut-être que la gravité de ta collision est trop forte.
Hors ligne
Bah j'aimerai bien déjà avoir de la gravité xD
Je ne suis même pas attiré par le sol.
J'ai beau changé les valeurs rien ne se passe...
Hors ligne
Utilises printf() pour vérifier l'état de tes variables (selector, anim...) et aussi pour vérifier que tes bouts de code conditionnés sont bien executés.
Hors ligne
Mais là je vois pas d'où viens le problème j'utilise le même code que si c'était une heightmap, et là cela ne marche alors que sur la heightmap c'était génial ...
#include <irrlicht.h> #include <iostream> using namespace std; using namespace irr; int main() { IrrlichtDevice *device = createDevice(video::EDT_OPENGL, core::dimension2d<u32>(1000,800), 32); video::IVideoDriver *driver = device -> getVideoDriver(); scene::ISceneManager *sceneManager = device -> getSceneManager(); device->setWindowCaption(L"Fast Jump [INDEV]"); device->getCursorControl()->setVisible(false); scene::IAnimatedMesh *map = sceneManager -> getMesh("mapp.obj"); scene::ImeshSceneNode *scene = sceneManager -> addMeshSceneNode(map -> getMesh(0)); scene::ITriangleSelector *selector = NULL; if (scene) { scene -> setMaterialFlag(video::EMF_LIGHTING,false); scene -> setMaterialTexture(0, driver -> getTexture("terrain-texture.jpg")); sceneManager -> getMeshManipulator() -> makePlanarTextureMapping(map -> getMesh(0), 0.4f); selector = sceneManager->createOctTreeTriangleSelector(map->getMesh(0), scene); if(selector) { scene->setTriangleSelector(selector); selector->drop(); } } SKeyMap keyMap[5]; keyMap[0].Action = irr::EKA_MOVE_FORWARD; keyMap[0].KeyCode = irr::KEY_KEY_Z; keyMap[1].Action = irr::EKA_MOVE_BACKWARD; keyMap[1].KeyCode = irr::KEY_KEY_S; keyMap[2].Action = irr::EKA_STRAFE_LEFT; keyMap[2].KeyCode = irr::KEY_KEY_Q; keyMap[3].Action = irr::EKA_STRAFE_RIGHT; keyMap[3].KeyCode = irr::KEY_KEY_D; keyMap[4].Action = EKA_JUMP_UP; keyMap[4].KeyCode = KEY_SPACE; scene::ICameraSceneNode* camera = sceneManager-> addCameraSceneNodeFPS(0,100.0f,0.025f, -1, keyMap, 5, true, 100.5f); camera->setPosition(core::vector3df(0,4,0)); camera->setTarget(core::vector3df(10000,10000,10000)); camera->setFarValue(42000.0f); if(selector) { scene::ISceneNodeAnimator *anim = sceneManager->createCollisionResponseAnimator(selector, camera, core::vector3df(100,100,100), core::vector3df(0,0,0), core::vector3df(0,0,0)); camera->addAnimator(anim); anim->drop(); } while(device -> run()) { driver -> beginScene(true, true, video::SColor(255,90,146,177)); sceneManager -> drawAll(); driver->endScene(); } device -> drop(); return 0; }
Hors ligne
Tu le fais exprès ou quoi? dans "createCollisionResponseAnimator()" la gravité est à 0, normal que tu n'es pas de gravité!
Hors ligne
Sa change rien.
Dans ma zone où se trouve mon terrain il y a pas de gravité et dès que j'en sors j'ai de la gravité et mes sauts qui marchent.
Où change t'on les coordonnées de ma map. Car du coup cela doit venir de çà.
Je suis vraiment désolé de t'embeter, et non je le fais pas exprès c'est juste que je bloque sur le sujet donc je change plein de trucs.
Hors ligne
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 23 invités en ligne Aucun membre connecté RSS Feed |