[Irrlicht] - Hindernisse

  • Hallo Leute (bin neu hier) !

    Ich befasse mich seit kurzem mit irrlicht und möchte gern ein paar dinge ausprobieren.
    Leider hänge ich schon am anfang und hoffe ihr könnt mir helfen.

    In diesem Beispiel wird eine gekachlte Plattform erstellt. Die Kacheln der Plattform soll man
    später bewegen können, aber das ist jetzt nicht so wichtig.

    Meine Frage:
    Wie kann ich die kacheln als Hindernis erkennen , damit die Kamera nicht mehr durch die
    Plattform fährt (,aber von der Plattform fallen kann.) ?..... kann mir das jemand erklären?


    - Danke im Voraus!

    [autoit]


    #include "..\au3Irrlicht2.au3"

    [/autoit][autoit][/autoit][autoit]

    HotKeySet("{ESC}", "_exit")

    [/autoit][autoit][/autoit][autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit][autoit][/autoit][autoit]

    Global $ROWS_AND_COLUMNS = 40
    Global $hLOD2Mesh
    Global $iAmountNodes = $ROWS_AND_COLUMNS * $ROWS_AND_COLUMNS
    Global $aSceneNodes[$iAmountNodes]
    Global $hMaterial
    Global $k = 0
    Global $hLODManager
    Global $hCamera

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _IrrStart( $IRR_EDT_OPENGL, 800, 600, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_SHADOWS, $IRR_IGNORE_EVENTS, $IRR_VERTICAL_SYNC_ON )

    [/autoit][autoit][/autoit][autoit]

    $hLOD2Mesh = _IrrGetMesh("../media/cube.x")
    local $sceneNode = _IrrAddMeshToScene( $hLOD2Mesh )
    _IrrScaleMesh($hLOD2Mesh, 2.0)
    _IrrSetMeshHardwareAccelerated($hLOD2Mesh)
    $texture = _IrrGetTexture("../media/Cross.bmp")

    [/autoit][autoit][/autoit][autoit]

    For $i = -($ROWS_AND_COLUMNS / 2) To ($ROWS_AND_COLUMNS / 2) - 1
    For $j = -($ROWS_AND_COLUMNS / 2) To ($ROWS_AND_COLUMNS / 2) - 1
    $aSceneNodes[$k] = _IrrAddMeshToScene($hLOD2Mesh)
    _IrrSetNodePosition($aSceneNodes[$k], $i * 5.0, 0.0, $j * 5.0)
    _IrrSetNodeMaterialTexture($aSceneNodes[$k], $texture, 0)
    _IrrSetNodeMaterialFlag($aSceneNodes[$k], $IRR_EMF_LIGHTING, $IRR_ON)
    $hMaterial = _IrrGetMaterial($aSceneNodes[$k], 0)
    _IrrMaterialVertexColorAffects($hMaterial, $ECM_NONE)
    _IrrMaterialSetAmbientColor($hMaterial, 255, 255, 255, 255)
    _IrrMaterialSetDiffuseColor($hMaterial, 255, 255, 255, 255)
    $k += 1
    Next
    Next
    $hLODManager = _IrrAddLODManager(2, $IRR_off)
    _IrrSetLODMaterialMap($hLODManager, $IRR_EMT_TRANSPARENT_ADD_COLOR, $IRR_EMT_TRANSPARENT_ADD_COLOR)
    _IrrAddLODMesh($hLODManager, 600.0, $hLOD2Mesh)
    _IrrSetNodeMaterialFlag($hLODManager, $IRR_EMF_LIGHTING, $IRR_OFF)
    For $i = 0 To $k - 1
    _IrrAddChildToParent($aSceneNodes[$i], $hLODManager)
    Next

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $Camera = _IrrAddFPSCamera()
    $CameraNode = $Camera
    _IrrSetNodePosition( $CameraNode, 200, 100, 0 )
    _IrrSetNodeRotation( $CameraNode, 0, -90, 0 )
    _IrrSetAmbientLight(1, 1, 1)
    _IrrHideMouse()

    [/autoit][autoit][/autoit][autoit]

    While _IrrRunning() And Sleep(10)
    _IrrBeginScene(0, 0, 0)
    _IrrDrawScene()
    _IrrEndScene()
    WEnd

    [/autoit][autoit][/autoit][autoit]

    _IrrStop()

    [/autoit]
  • Nutze den ISceneNodeAnimatorCollisionResponse.

    In C++:

    Code
    scene::ISceneNodeAnimatorCollisionResponse* collider =
    				sm->createCollisionResponseAnimator(
    				metaSelector, camera, core::vector3df(25,50,25),
    				core::vector3df(0, -10.f,0),
    					core::vector3df(0,45,0), 0.005f);
    
    
    			camera->addAnimator(collider);
    			collider->drop();

    sm ist dabei der SceneManager, camera das CameraSceneNode, metaSelector der Triangleselector der meshes.

  • Hy!
    Danke für deine Antwort aber leider verstehe ich nicht ganbz was du damit meinst.
    Könntest du mir das ein wenig erklären?

    Ich habe ein bsp zu _IrrAddCollisionAnimator:

    [autoit]


    $NodeGround = _IrrGetSceneNodeFromID( "-1" )
    $SelectorGround = _IrrGetCollisionGroupFromBox( $NodeGround )
    $CombinedCollision = _IrrCreateCombinedCollisionGroup ()
    _IrrAddCollisionGroupToCombination ( $CombinedCollision, $SelectorGround )

    [/autoit][autoit][/autoit][autoit]

    $CollisionAnimator = _IrrAddCollisionAnimator( _
    $CombinedCollision, $CameraNode, _
    10.0,10.0,10.0, _
    0.0,-0.1,0.0, _
    0.0,50.0,0.0 )

    [/autoit]

    ...aber ich kapier es einfach nicht, bei mir kommt es immer zum absturz bzw funkt es nicht.

  • Also das mit der schwerkraft habe ich jetzt hinbekommen...

    [autoit]


    #include "..\au3Irrlicht2.au3"

    [/autoit][autoit][/autoit][autoit]

    HotKeySet("{ESC}", "_exit")

    [/autoit][autoit][/autoit][autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit][autoit][/autoit][autoit]

    Global $ROWS_AND_COLUMNS = 40
    Global $hLOD2Mesh
    Global $iAmountNodes = $ROWS_AND_COLUMNS * $ROWS_AND_COLUMNS
    Global $aSceneNodes[$iAmountNodes]
    Global $hMaterial
    Global $k = 0
    Global $hLODManager
    Global $hCamera

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _IrrStart( $IRR_EDT_OPENGL, 800, 600, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_SHADOWS, $IRR_IGNORE_EVENTS, $IRR_VERTICAL_SYNC_ON )

    [/autoit][autoit][/autoit][autoit]

    $hLOD2Mesh = _IrrGetMesh("../media/cube.x")
    local $sceneNode = _IrrAddMeshToScene( $hLOD2Mesh )
    _IrrScaleMesh($hLOD2Mesh, 2.0)
    _IrrSetMeshHardwareAccelerated($hLOD2Mesh)
    $texture = _IrrGetTexture("../media/Cross.bmp")

    [/autoit][autoit][/autoit][autoit]

    For $i = -($ROWS_AND_COLUMNS / 2) To ($ROWS_AND_COLUMNS / 2) - 1

    [/autoit][autoit][/autoit][autoit]

    For $j = -($ROWS_AND_COLUMNS / 2) To ($ROWS_AND_COLUMNS / 2) - 1
    $aSceneNodes[$k] = _IrrAddMeshToScene($hLOD2Mesh)
    _IrrSetNodeName($aSceneNodes[$k], "ground")
    _IrrSetNodePosition($aSceneNodes[$k], $i * 5.0, 0.0, $j * 5.0)
    _IrrSetNodeMaterialTexture($aSceneNodes[$k], $texture, 0)
    _IrrSetNodeMaterialFlag($aSceneNodes[$k], $IRR_EMF_LIGHTING, $IRR_ON)
    $hMaterial = _IrrGetMaterial($aSceneNodes[$k], 0)
    _IrrMaterialVertexColorAffects($hMaterial, $ECM_NONE)
    _IrrMaterialSetAmbientColor($hMaterial, 255, 255, 255, 255)
    _IrrMaterialSetDiffuseColor($hMaterial, 255, 255, 255, 255)
    $k += 1
    Next
    Next
    $hLODManager = _IrrAddLODManager(2, $IRR_off)
    _IrrSetLODMaterialMap($hLODManager, $IRR_EMT_TRANSPARENT_ADD_COLOR, $IRR_EMT_TRANSPARENT_ADD_COLOR)
    _IrrAddLODMesh($hLODManager, 600.0, $hLOD2Mesh)
    _IrrSetNodeMaterialFlag($hLODManager, $IRR_EMF_LIGHTING, $IRR_OFF)
    For $i = 0 To $k - 1
    _IrrAddChildToParent($aSceneNodes[$i], $hLODManager)

    [/autoit][autoit][/autoit][autoit]

    Next

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $Camera = _IrrAddFPSCamera()
    $CameraNode = $Camera

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $NodeGround = _IrrGetSceneNodeFromName( "ground" )
    $SelectorGround = _IrrGetCollisionGroupFromBox( $NodeGround )
    $CombinedCollision = _IrrCreateCombinedCollisionGroup ()
    _IrrAddCollisionGroupToCombination ( $CombinedCollision, $SelectorGround )
    $CollisionAnimator = _IrrAddCollisionAnimator( _
    $CombinedCollision, $CameraNode, _
    10.0,10.0,10.0, _
    0.0,-0.1,0.0, _
    0.0,50.0,0.0 )

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _IrrSetNodePosition( $CameraNode, 200, 100, 0 )
    _IrrSetNodeRotation( $CameraNode, 0, -90, 0 )
    _IrrSetAmbientLight(1, 1, 1)
    _IrrHideMouse()

    [/autoit][autoit][/autoit][autoit]

    While _IrrRunning() And Sleep(10)
    _IrrBeginScene(0, 0, 0)
    _IrrDrawScene()
    _IrrEndScene()
    WEnd

    [/autoit][autoit][/autoit][autoit]

    _IrrStop()

    [/autoit][autoit][/autoit][autoit][/autoit]

    ...was jetzt noch fehlt ist die kachel erkennung, damit die kamera stehen bleibt und nicht mehr durchfällt.

  • Spoiler anzeigen
    [autoit]

    #include "..\au3Irrlicht2.au3"

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{ESC}", "_exit")

    [/autoit] [autoit][/autoit] [autoit]

    Func _exit()
    _IrrStop()
    Exit
    EndFunc ; _exit

    [/autoit] [autoit][/autoit] [autoit]

    Global $ROWS_AND_COLUMNS = 40
    Global $hLOD2Mesh
    Global $iAmountNodes = $ROWS_AND_COLUMNS * $ROWS_AND_COLUMNS
    Global $aSceneNodes[$iAmountNodes]
    Global $hMaterial
    Global $k = 0
    Global $hLODManager
    Global $hCamera

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _IrrStart( $IRR_EDT_OPENGL, 800, 600, $IRR_BITS_PER_PIXEL_32, _
    $IRR_WINDOWED, $IRR_SHADOWS, $IRR_IGNORE_EVENTS, $IRR_VERTICAL_SYNC_ON )

    [/autoit] [autoit][/autoit] [autoit]

    $hLOD2Mesh = _IrrGetMesh("../media/cube.x")
    local $sceneNode = _IrrAddMeshToScene( $hLOD2Mesh )
    _IrrScaleMesh($hLOD2Mesh, 2.0)
    _IrrSetMeshHardwareAccelerated($hLOD2Mesh)
    $texture = _IrrGetTexture("../media/Cross.bmp")

    [/autoit] [autoit][/autoit] [autoit]

    For $i = -($ROWS_AND_COLUMNS / 2) To ($ROWS_AND_COLUMNS / 2) - 1

    [/autoit] [autoit][/autoit] [autoit]

    For $j = -($ROWS_AND_COLUMNS / 2) To ($ROWS_AND_COLUMNS / 2) - 1
    $aSceneNodes[$k] = _IrrAddMeshToScene($hLOD2Mesh)
    _IrrSetNodeName($aSceneNodes[$k], "ground")
    _IrrSetNodePosition($aSceneNodes[$k], $i * 5.0, 0.0, $j * 5.0)
    _IrrSetNodeMaterialTexture($aSceneNodes[$k], $texture, 0)
    _IrrSetNodeMaterialFlag($aSceneNodes[$k], $IRR_EMF_LIGHTING, $IRR_ON)
    $hMaterial = _IrrGetMaterial($aSceneNodes[$k], 0)
    _IrrMaterialVertexColorAffects($hMaterial, $ECM_NONE)
    _IrrMaterialSetAmbientColor($hMaterial, 255, 255, 255, 255)
    _IrrMaterialSetDiffuseColor($hMaterial, 255, 255, 255, 255)
    $k += 1
    Next
    Next
    $hLODManager = _IrrAddLODManager(2, $IRR_off)
    _IrrSetLODMaterialMap($hLODManager, $IRR_EMT_TRANSPARENT_ADD_COLOR, $IRR_EMT_TRANSPARENT_ADD_COLOR)
    _IrrAddLODMesh($hLODManager, 600.0, $hLOD2Mesh)
    _IrrSetNodeMaterialFlag($hLODManager, $IRR_EMF_LIGHTING, $IRR_OFF)
    For $i = 0 To $k - 1
    _IrrAddChildToParent($aSceneNodes[$i], $hLODManager)

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Camera = _IrrAddFPSCamera()
    $CameraNode = $Camera

    [/autoit] [autoit][/autoit] [autoit]

    $CombinedCollision = _IrrCreateCombinedCollisionGroup ()
    For $i=0 To $iAmountNodes-1
    $SelectorGround = _IrrGetCollisionGroupFromBox( $aSceneNodes[$i] )
    _IrrAddCollisionGroupToCombination ( $CombinedCollision, $SelectorGround )
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $CollisionAnimator = _IrrAddCollisionAnimator( _
    $CombinedCollision, $CameraNode, _
    1.0,1.0,1.0, _
    0.0,-0.2,0.0, _
    0.0,1.0,0.0 )

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _IrrSetNodePosition( $CameraNode, 200, 100, 0 )
    _IrrSetNodeRotation( $CameraNode, 0, -90, 0 )
    _IrrSetAmbientLight(1, 1, 1)
    _IrrHideMouse()

    [/autoit] [autoit][/autoit] [autoit]

    While _IrrRunning() And Sleep(10)
    _IrrBeginScene(0, 0, 0)
    _IrrDrawScene()
    _IrrEndScene()
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _IrrStop()

    [/autoit]