Kollision

Sobald der Spieler durch die Spielwelt laufen kann, tritt das Problem auf, dass er mit den in der Welt enthaltenen Objekten kollidieren muss.

// Raycaster left
raycasterXneg = new THREE.Raycaster(new THREE.Vector3(), new THREE.Vector3(), 0, Math.sqrt(PLAYERHEIGHT*PLAYERHEIGHT+900));

Um dieses Problem zu lösen werden verschiedene Raycaster benutzt. Es werden insgesammt vier Raycaster verwendet, jeweils einer, der nach vorne, hinten, rechts und links zeigt.

octreeObjectsXneg = octree.search( raycasterXneg.ray.origin, raycasterXneg.far, true, raycasterXneg.ray.direction );
intersectionsXneg = raycasterXneg.intersectOctreeObjects( octreeObjectsXneg );

Dann werden in jedem Frame die Schnittpunkte der Rays mit den Objekten in der Szene berechnet. Das OctreeObject dient hierbei zur Performanceverbesserung und wird im entsprechenden Kapitel näher erläutert.

if (intersectionsXneg.length > 0) {
        gameObj = getGameObject(intersectionsXneg[0].object);
        if (gameObj.type == TYPE_FIRE) {
            fireAction();
        } else if (gameObj.type == TYPE_TRIGGER) {
            gameObj.interact();
            disableTrigger(gameObj);
        } else {
            velocity.x = Math.max(0, velocity.x);
        }
    }

Wird ein Schnittpunkt in der unmittelbaren nähe des Spielers festgestellt, kann dieser sich nicht mehr weiter in Richtung Schnittpunkt bewegen. Ist das Objekt Interactable, werden entsprechend des Typs verschiedene Vorgehen angewandt. Dies wird im Kapitel über Interaktionen näher erläutert.

Bezüglich der Rays war die erste Idee in alle vier Richtungen jeweils einen Strahl waagerecht auf Kopfhöhe laufen zu lassen. Dabei tritt aber das Problem auf, dass kleine Objekte nicht erkannt werden. Die zweite Idee war recht ähnlich, nur das der Strahl nicht mehr auf Kopfhöhe, sondern am Boden ausgesandt wurde. Auch hier wurden viele Objekte, wie z.B. Tische, nicht erkannt. Auch bei der Verwendung von beiden Strahlen zusammen traten viele Fehler auf und selbst bei sehr kleinen Szenen führte diese Art der Kollisionsberechnung zu sehr starken "Ruckelern".

Daher werden vier Rays verwendet, die an den Füßen des Spielers beginnen, schräg nach oben laufen und auf Kopfhöhe des Spielers enden. Diese Rays erkennen sowohl kleine, als auch große Objekte. Und auch "schwebende" Objekte wie Waschbecken und Tische werden von diesen Rays erkannt.

Zusätzlich zu den oben beschriebenen Rays werden noch zwei weitere verwendet. Jeweils einer nach oben und einer nach unten. Der Strahl nach oben dient dazu, Kollisionen mit Objekten über dem Spieler festzustellen, während dieser geduckt ist. Der Strahl nach unten berechnet den Schnittpunkt mit dem Boden oder Objekten, auf denen der Spieler steht.

results matching ""

    No results matching ""