Het maken van een basis 3D-Engine in Java (3 / 5 stap)

Stap 3: De klasse Camera

Nu laten we een andere omweg en de klasse Camera instellen. De klasse Camera houdt spoor van waar de speler bevindt zich in de 2D kaart en zorgt ook voor het bijwerken van de speler positie. Om dit te doen de klasse implementeert KeyListener, dus het moet importeren van KeyEvent en KeyListener.

 import java.awt.event.KeyEvent;<br>import java.awt.event.KeyListener; 

Veel variabelen zijn nodig om bij te houden van de camera positie en wat het kan zien. Hierdoor is het eerste stuk van de klasse ziet er als volgt:

 public class Camera implements KeyListener { public double xPos, yPos, xDir, yDir, xPlane, yPlane; public boolean left, right, forward, back; public final double MOVE_SPEED = .08; public final double ROTATION_SPEED = .045; 

xPos en yPos zijn de locatie van de speler op de 2D kaart die ontstond in de Game klasse. xDir en yDir zijn de x en y-componenten van een vector die wijst in de richting van de speler wordt geconfronteerd. xPlane en yPlane zijn ook de x en y-componenten van een vector. De vector gedefinieerd door xPlane en yPlane is altijd loodrecht op de richting vector, en deze verwijst naar de verste rand van het gezichtsveld van de camera's aan de ene kant. De verste rand aan de andere kant is gewoon de negatieve vliegtuig vector. Wat zit er in het gezichtsveld van de camera's, gedefinieerd door de combinatie van de vectoren van de richting en de vliegtuig-vector. De booleans worden gebruikt om bij te houden welke toetsen zijn wordt ingedrukt door de gebruiker, zodat de gebruiker de camera kan bewegen. MOVE_SPEED en ROTATION_SPEED dicteren hoe snel de camera beweegt en draait terwijl de gebruiker is op de overeenkomstige toets te drukken.

Volgende halte is de constructor. De constructor neemt in waarden die de klasse vertellen waar de camera zich bevindt en wat het zien kan en wijst ze toe aan de bijbehorende variabele (xPos, yPos...).

 public Camera(double x, double y, double xd, double yd, double xp, double yp) { xPos = x; yPos = y; xDir = xd; yDir = yd; xPlane = xp; yPlane = yp; } 

Een camera-object nodig zullen worden in het definitieve programma, dus laten we gaan vooruit en één toevoegen. In het spel klasse met alle van de andere declaraties van variabelen toevoegen in

 public Camera camera; 

en in de constructor toevoegen in

 camera = new Camera(4.5, 4.5, 1, 0, 0, -.66); addKeyListener(camera); 

Deze camera werkt met de kaart die ik gebruik, als u een andere kaart gebruikt of als u wilt laten beginnen op een andere locatie waardecorrecties op xPos en yPos (4 en 6 in mijn voorbeeld). Gebruik.66 geeft wat ik voel is een goede gezichtsveld, maar u kunt de waarde om een verschillende FOV aanpassen.

Nu dat de klasse Camera een constructor heeft kunnen we beginnen met het toevoegen van methoden voor het bijhouden van de ingangen van de gebruiker en voor het bijwerken van de positie/oriëntatie van de camera. Omdat de klasse Camera KeyboardListener te geven implementeert moet het alle methoden van het ten uitvoer gelegd. Eclipse moet u deze methoden toevoegen automatisch gevraagd. U kunt de methode keyTyped leeg laten, maar de andere twee methoden zullen worden gebruikt. keyPressed zal het instellen van de booleans op true wanneer de bijbehorende sleutels worden ingedrukt, en keyReleased hen terug naar false veranderen zal wanneer de sleutels worden vrijgegeven. De methoden er als volgt uitzien:

 public void keyPressed(KeyEvent key) { if((key.getKeyCode() == KeyEvent.VK_LEFT)) left = true; if((key.getKeyCode() == KeyEvent.VK_RIGHT)) right = true; if((key.getKeyCode() == KeyEvent.VK_UP)) forward = true; if((key.getKeyCode() == KeyEvent.VK_DOWN)) back = true; } 

en

 public void keyReleased(KeyEvent key) { if((key.getKeyCode() == KeyEvent.VK_LEFT)) left = false; if((key.getKeyCode() == KeyEvent.VK_RIGHT)) right = false; if((key.getKeyCode() == KeyEvent.VK_UP)) forward = false; if((key.getKeyCode() == KeyEvent.VK_DOWN)) back = false; } 

Nu dat de klasse Camera is het houden van spoor van die toetsen zijn ingedrukt kunnen we beginnen met het bijwerken van de speler positie. Om dit te doen die zullen we een update-methode die wordt aangeroepen in de run methode van de klasse in het spel gebruiken. Terwijl we in het we ga je gang en botsingdetectie aan de methode update toevoegen door het passeren van de kaart naar het wanneer deze wordt aangeroepen in de Game klasse. De methode update ziet er zo uit:

 public void update(int[][] map) { if(forward) { if(map[(int)(xPos + xDir * MOVE_SPEED)][(int)yPos] == 0) { xPos+=xDir*MOVE_SPEED; } if(map[(int)xPos][(int)(yPos + yDir * MOVE_SPEED)] ==0) yPos+=yDir*MOVE_SPEED; } if(back) { if(map[(int)(xPos - xDir * MOVE_SPEED)][(int)yPos] == 0) xPos-=xDir*MOVE_SPEED; if(map[(int)xPos][(int)(yPos - yDir * MOVE_SPEED)]==0) yPos-=yDir*MOVE_SPEED; } if(right) { double oldxDir=xDir; xDir=xDir*Math.cos(-ROTATION_SPEED) - yDir*Math.sin(-ROTATION_SPEED); yDir=oldxDir*Math.sin(-ROTATION_SPEED) + yDir*Math.cos(-ROTATION_SPEED); double oldxPlane = xPlane; xPlane=xPlane*Math.cos(-ROTATION_SPEED) - yPlane*Math.sin(-ROTATION_SPEED); yPlane=oldxPlane*Math.sin(-ROTATION_SPEED) + yPlane*Math.cos(-ROTATION_SPEED); } if(left) { double oldxDir=xDir; xDir=xDir*Math.cos(ROTATION_SPEED) - yDir*Math.sin(ROTATION_SPEED); yDir=oldxDir*Math.sin(ROTATION_SPEED) + yDir*Math.cos(ROTATION_SPEED); double oldxPlane = xPlane; xPlane=xPlane*Math.cos(ROTATION_SPEED) - yPlane*Math.sin(ROTATION_SPEED); yPlane=oldxPlane*Math.sin(ROTATION_SPEED) + yPlane*Math.cos(ROTATION_SPEED); } } 

De onderdelen van de methode waarmee u vooruit en achteruit verkeer werken door toevoeging van xDir en yDir aan xPos en yPos, respectievelijk. Voordat deze beweging gebeurt wordt gecontroleerd als het verkeer zal de camera een binnenwand en niet met het verkeer doorlopen als het zal. Voor rotatie zowel de richting vector en het vliegtuig vector worden vermenigvuldigd met de rotatie-matrix, die is:

 [ cos(ROTATION_SPEED) -sin(ROTATION_SPEED) ] [ sin(ROTATION_SPEED) cos(ROTATION_SPEED) ] 

om hun nieuwe waarden. Met de methode van de update voltooid kunnen we het nu van de Game klasse noemen. In de Game' run klassenmethode toevoegen de volgende coderegel waar het hier wordt weergegeven

 Add this: camera.update(map); in here: while(running) { long now = System.nanoTime(); delta = delta + ((now-lastTime) / ns); lastTime = now; while (delta >= 1)//Make sure update is only happening 60 times a second { //handles all of the logic restricted time camera.update(map); delta--; } render();//displays to the screen unrestricted time } 

Nu dat dat gebeurt kunnen we eindelijk gaan naar de laatste klas en berekenen van het scherm!

Gerelateerde Artikelen

LibreOffice Base Tutorial (het maken van een filter in een formulier)

LibreOffice Base Tutorial (het maken van een filter in een formulier)

In deze Tutorial, ik maak een nieuwe database gemaakt met LibreOffice Base en ik probeer om een filter-formulier met behulp van een externe SQL-Query.Met behulp van tekstvak of keuzelijst met invoervak als parameter voor het zoeken naar items in reco
Het maken van een einde-korrel snijplank - ik maakte het op Techshop

Het maken van een einde-korrel snijplank - ik maakte het op Techshop

hieronder zijn verschillende snijplanken die ik bij Techshop, San Francisco, een lidmaatschap op basis workshop met alle soorten van hulpmiddelen gemaakt heb voor het maken van dingen. Ik heb niet veel ervaring met houtbewerking, dus ik dit project g
Het maken van een drie stenen diamond engagement ring.

Het maken van een drie stenen diamond engagement ring.

Dus, je hebt het meisje van uw dromen ontmoet, en nu wilt u geef haar een mooie ring als een blijvend symbool van uw liefde.Probleem is, kun je niet veroorloven een fancy ontwerper ring, en het je kunt veroorloven zijn massa geproduceerd, bezaaid met
Het maken van een 5 Dollar 5 Minute Birdhouse.

Het maken van een 5 Dollar 5 Minute Birdhouse.

Vorig jaar, verhuisd mijn vriendin en ik naar onze eerste plaats samen, een nucleaire-tijdperk-bungalow met een mooie achtertuin. We wilden zetten sommige vogels huizen, maar we waren allebei erg druk met werk en voorjaar was net om de hoek. Dus, ik
Tutorial over het maken van een zwart Locust boog

Tutorial over het maken van een zwart Locust boog

allereerst ik wil excuses voor eventuele grammaticafouten, en eventuele andere fouten schriftelijk caus ik gebruikte google vertalen voor het vertalen van alle tekst die u hier ziet (Engl is niet mijn eigen languge dus schreef ik allemaal in mijn lan
Het maken van een fossiele duizendpoot.

Het maken van een fossiele duizendpoot.

Na instructable wordt beschreven hoe u een duizendpoot-achtige fossiele.Het grafische deel werd gedaan in 3 NodeBox, een open source applicatie voor generative design (en nog veel meer).De gravure deel werd gedaan op een cnc-Snijder (Trotec - Speedy
Het maken van een Cat(?) Masker met glasvezel

Het maken van een Cat(?) Masker met glasvezel

ik ben niet nieuw voor Instructables, maar ik figuur it's about time ik een account te krijgen en terug te geven aan een website die mij zo veel inspiratie en informatie heeft gegeven. Dit is mijn eerste post, zodat alle opmerkingen en kritiek welkom
Het maken van een DIY borstelloze Gimbal met Arduino

Het maken van een DIY borstelloze Gimbal met Arduino

Dit is een verhaal van mijn derde project met goedkope gyro en Arduino.Na de eerdere twee projecten, Gemakkelijk omgekeerd slinger en 3D kalligrafie, ik gedacht heb van het maken van Camera Gimbal met Arduino. Dan had ik drie beleidsregels voor het p
Het maken van een hart ($) gevormd geld Clip in Blender

Het maken van een hart ($) gevormd geld Clip in Blender

Hallo iedereen, je kent mij vanaf mijn animatronic creaties zoals johnny 5, robot tanks en Wall-E.Vandaag, ga ik u tonen hoe te een hartvormige geld clip maken in de blender.Hier is een link naar de mix bestand https://dl.dropboxusercontent.com/u/187
Het maken van een Nintendo SNES-controller in bluetooth; met behulp van een MSI-BGP100

Het maken van een Nintendo SNES-controller in bluetooth; met behulp van een MSI-BGP100

als, zoals velen, u de BGP100 bluetooth gadget wilt voor het spelen van bluetooth op smartphones en PDA's, maar houd niet van de knoppen en het gevoel van de domeincontroller die wordt geleverd met het, hoe zit de herhuisvesting van de controller in
Flip Top fles dop. Het maken van een duurzaam en sterk fles dop voor elke fles wijn of bier.

Flip Top fles dop. Het maken van een duurzaam en sterk fles dop voor elke fles wijn of bier.

Waarschuwing: Dit ondoorgrondelijke is een work in progress. Heeft behoefte aan een heleboel werk.Met deze kroonkurk kunt u elke fles of pot die u wilt sluiten.Je moet.Een fles met een rand in de buurt van de monding van de nek. (Wijn en bier flessen
Lessen in het maken van een middeleeuwse Vielle

Lessen in het maken van een middeleeuwse Vielle

Dit is mijn replica van een middeleeuwse vielle, een voorouder van de moderne viool. Het werd gespeeld door troubadours uit de 13e tot de 15e eeuw.Dit is niet bedoeld als een complete gids voor het maken van een vielle, noch mijn vielle bijzonder aut
Eenvoudige metaalbewerking technieken en het maken van een vlinder staal

Eenvoudige metaalbewerking technieken en het maken van een vlinder staal

Blacksmithing en traditionele metaalbewerking zijn oude ambachten en technieken die snel uit de samenleving verdwijnen. Sommige van die eenvoudige-keer vreugde te herwinnen door te leren hoe om dingen met een hamer en aambeeld te maken! Creativiteit
Van het scherm voor mij: het maken van een prop

Van het scherm voor mij: het maken van een prop

In dit, mijn eerste instructible, ik in detail te beschrijven hoe ik (met hulp) een variatie op een prop van de BBC-show Torchwood gemaakt.  De prop in kwestie is de "Vortex Manipulator" gevonden op de pols van Captain Jack Harkness.  Hieronder