Xtreme3D - Objekt-/Modelkollision

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Xtreme3D - Objekt-/Modelkollision

    Hi!
    Und schon wieder ein Problem!
    Wie funktioniert die Modelcollision in Xtreme3D??? Ich kriege es zum erbrechen nicht hin!
    ich habe es endlich geschafft eine 3ds-map zu bauen nun möchte ich auch dass meine tanks gegen diese map fahren können und "von mauern gestoppt werden, möglichst ohne sich drin zu verhaken".
    Ich suche schon wochenlang nach irgendwelchen hilfen oder tutorials aber hab nix gefunden ich hoffe ihr könnt mir helfen!

    "Make love, not Warcraft"

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von HuRr!cAnE ()

  • Du scheinst ja der einzige hier auf gm-d zu sein, der mit Xtreme3D arbeitet.
    Vielleicht hilft dir ja das example weiter. Läuft mit dem original test.pak file. (ist nicht von mir... ich blick da ehrlich gesagt noch nicht ganz durch... ;)

    Ich hätte auch nen Material-editor für Xtreme3D geschrieben.
    Xtreme3D - Material
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Jürgen ()

  • hm ja tut mir leid aber das hilft mir nich weiter, ich finde in dem example nicht die stelle mit den collisionen! hat noch jemand eine idee wie ich modelkollision mit ODE oder so machen kann?

    "Make love, not Warcraft"
  • Mit ODE hab ich leider überhaupt keine Erfahrung aber ich hab dir jetzt mal die stellen im third_person_example mit //* gekennzeichnet, die für die collision verantwortlich sind.

    create_event of o_engine

    Quellcode

    1. EngineCreate(window_handle());
    2. view1=ViewerCreate(0,0,640,480);
    3. //ViewerEnableVSync(view1,vsmSync);
    4. ViewerSetLighting(view1,false); // light does not affect materials
    5. ViewerSetBackgroundColor(view1,c_blue);
    6. back=DummycubeCreate(0); // background objects: skybox, skydome, ...
    7. scene=DummycubeCreate(0);
    8. front=DummycubeCreate(0); // foreground objects: hudsprite, hudtext,...
    9. // just to see something in the template
    10. font=WindowsBitmapfontCreate('Arial',10);
    11. fpstext=HUDTextCreate(font,'FPS:',front);
    12. // speeds up rendering:
    13. set_automatic_draw(false);
    14. SetPakArchive('test.pak');
    15. matlib = MaterialLibraryCreate();
    16. MaterialLibraryActivate(matlib);
    17. nav=NavigatorCreate(); //* here for collision
    18. fpsmanager=FpsManagerCreate(); //* here for collision
    19. FpsManagerSetNavigator(fpsmanager,nav); //* assign navigator to fpsManager
    20. FpsManagerSetMovementScale(fpsmanager,100); //* something to do with gravity
    21. // level with materials
    22. level=FreeformCreate('level2.3ds',scene);
    23. // the exact same level with lightmap coords as texture coords
    24. lightmap=FreeformCreate('level2lm.3ds',0);
    25. // set level's lightmap coords to lightmap's texture coords
    26. FreeformSetSecondTextureCoords(level,lightmap);
    27. ObjectDestroy(lightmap);
    28. ObjectSetDirection(level,0,1,0);
    29. FpsManagerAddMap(fpsmanager,level); //* assign the level to your fpsManager
    Alles anzeigen


    create_event of o_actor

    Quellcode

    1. // window center for mouselook
    2. mx=display_get_width()/2;
    3. my=display_get_height()/2;
    4. pitch = 0
    5. xrot = 180
    6. dir = 0
    7. // create a dummycube for moving and turning
    8. Pos=DummycubeCreate(o_engine.scene);
    9. ObjectSetPosition(Pos,0,12,0);
    10. FpsSetManager(Pos,o_engine.fpsmanager); //* assign dummycube to fpsmanager
    11. FpsSetSphereRadius(Pos,6); //* your collision_sphere try smaller and higher numbers
    12. FpsSetGravity(Pos,true); //* switch on/off gravity
    13. // add a actor
    14. actor=ActorCreate('Trinityrage.smd',Pos)
    15. ObjectSetDirection(actor,0,1,0);
    16. ObjectSetPosition(actor,0,-6,0)
    17. ObjectSetScale(actor,0.1,0.1,0.1);
    18. ActorSwitchToAnimation(actor,0);
    19. // now create a dummycube to adjust the camera viewing point
    20. CamTarget=DummycubeCreate(Pos);
    21. ObjectSetPosition(CamTarget,0,10,pitch)
    22. // create a dummycube to move the camera
    23. CamDum=DummycubeCreate(CamTarget)
    24. // this is the distance between the camera and the object, relative.
    25. ObjectSetPosition(CamDum,0,10,20-(pitch*2))
    26. // create a camera
    27. camera=CameraCreate(o_engine.scene);
    28. CameraSetTargetObject(camera,CamTarget)
    29. CameraSetViewDepth(camera,1800);
    30. // activate camera for viewer
    31. ViewerSetCamera(o_engine.view1,camera);
    32. MouseSetPosition(mx,my);
    Alles anzeigen


    Insgesamt sind es ja nur 8 Zeilen code... dann übernimmt der FPSManager die gesamte Kollisionsarbeit. Vielleicht hilft's ja. :)

    Was dir auch noch helfen könnte:
    Xtreme3d als GEX-Extension:
    64digits.com/download.php?name=Xtreme3D.zip&id=17879
    Da siehste dann gleich alle vorhanden funktionen mit parametern.
    Einfach dll_init() weglassen alle Xtreme3D-Scripts löschen und die Extension installieren.
    Nur vorsicht die MouseLook funktion ist keine Xtreme3D funktion... die also behalten.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Jürgen ()

  • OK danke werd ich gleich ma austesten.
    ...aber es is vorprogrammiert dass das object dann nur stehenbleibt wenn die kollision vorhanden ist oder? also kann ich z.b. nich machen dass nen raketenobject bei der kollision mit einem anderen model (map) nen explosionsobject erzeugt!?

    "Make love, not Warcraft"
  • vielleicht geht's mit

    Quellcode

    1. FpsGetCollidedObject(obj,index);


    Ich hab ja noch nie diesen FpsManager benutzt
    sondern die collisionen immer mit

    Quellcode

    1. ObjectCheckCubeVsCube(obj1,obj2);

    überprüft

    zuerst hab ich auf komplizierte Modelle einen cube aufgesetzt, sozusagen nen bounding box cube
    den mit

    Quellcode

    1. ObjectHide(cube);

    versteckt

    und im step event mit

    Quellcode

    1. ObjectSetPositionOfObject(obj1,obj2);

    auf die gleiche Position wie das orginal object gesetzt.

    dann kann man mit

    Quellcode

    1. ObjectCheckCubeVsCube(boundingboxcube1,boundingboxcube2);

    die collision zwischen den beiden abfragen.

    Funktioniert wahrscheinlich auch ohne diese boundingboxcubes
    aber ist wahrscheinlich um einiges schneller

    Aber ich schätze du kanst auch einfach mit

    Quellcode

    1. if ObjectCheckCubeVsCube(raketenobject,3dsobject)
    2. {
    3. // explosion
    4. // rakete zerstören
    5. }

    abfragen ob ne collision zwischen rakete und wand da ist.