Generic Simple 3D Matrix Rotation-probleem

Ik heb een probleem met mijn rotatie op mijn 3D-object (het is in Java, maar het maakt niet echt uit)

De achtergrond:

Ik heb een eenvoudig 3D-model en je bent een first person-speler, je beweegt je muis omhoog om op te zoeken (I.E Rotate langs de x-as van de 3D) en beweeg je muis naar beneden om naar beneden te kijken (Draai in tegengestelde richting)

Maar:

Ik heb ook de linker- en rechterpijltoetsen om naar links/rechts te draaien (die de 3D-y-as roteert)

Nu is het probleem dat wanneer ik draai, wanneer ik roteer langs de x-as, deze niet meer draait zoals verwacht, dwz als je 180 graden draait, door je muis naar beneden te bewegen, kijk je eigenlijk omhoog en als je je muis omhoog beweegt, kijk je eigenlijk naar beneden.

Welke rotatie kan ik uitvoeren op de x/y-as om dit te repareren?

-Zo maakt niet uit hoeveel/weinig ik heb gedraaid, als je de muis omhoog beweegt, zal omhoog kijken en zal de muis omlaag bewegen naar beneden kijken.

Sorry, ik kan het niet beter uitleggen, maar als je meer informatie nodig hebt, maak dan gewoon een opmerking.

Hartelijk bedankt,

Het is waarschijnlijk een eenvoudige transformatie, maar ik kan niet denken :(

Een aantal Java-rotatiecode:

Muis omhoog/omlaag:

  public void rotateXY(double radians, double Yradians)
  {
      vpTrans.getTransform(T3D); 
      Transform3D test = new Transform3D();
      Transform3D testX = new Transform3D();
      Transform3D testY = new Transform3D();
      translate.set(lastXcord, lastYcord, lastZcord);
      testX.rotX(radians);
      testY.rotY(Yradians);
      test.mul(testX, testY);
      test.setTranslation(translate);
      vpTrans.setTransform(test);
      //System.out.println(test);
  }//end of rotateXY()

Links: (rechts is vergelijkbaar maar met min in plaats van plus op hoekveranderingen)

 public void run() {
    Transform3D test = new Transform3D();
    Transform3D rotX = new Transform3D();
    Transform3D rotY = new Transform3D();

    vpTrans.getTransform(T3D);
    translate.set(lastXcord, lastYcord, lastZcord);
    angle += 0.05;
    trueangle += 0.05;
    rotX.rotX(angle);
    rotY.rotY(Yangle);

    test.mul(rotX, rotY);

    test.setTranslation(translate);
    vpTrans.setTransform(test);
}

Welke transformaties/rotaties moet ik daaraan toevoegen, dus ongeacht de y-as, zal de camera omhoog kijken wanneer de muis op en neer wordt bewogen wanneer de muis naar beneden wordt bewogen ??

0
Ik kan op een gegeven moment de X/Y-as in de uitleg hebben gemengd, maar je krijgt het idee hopelijk !!
toegevoegd de auteur James Rattray, de bron

1 antwoord

Het lijkt erop dat je een probleem hebt met de volgorde van transformaties. In tegenstelling tot numerieke vermenigvuldiging is matrixvermenigvuldiging niet commutatief . 3D-toepassingen zijn erg gevoelig voor de volgorde van transformaties.

In Engels:

if x and y are numbers, then x * y = y * x

Als x en y matrices zijn, dan x * y < code> y * x !

Laten we met dat in gedachten eens kijken naar wat je aan het doen bent.

test.mul (rotX, rotY);

Visualiseer wat er gebeurt met deze vermenigvuldiging, stel je voor dat je een rechte lijn uit je hoofd hebt. We noemen dit LineUp . Kijk nu naar beneden naar je toetsenbord, stel je voor dat LineUp met je meegaat. Draai nu uw hoofd 90 graden op LineUp . Dat is wat er met uw rotatiematrix gebeurt. Gek he?

Now let's reverse the multiplication like so: test.mul(rotY, rotX);

Dus ga rechtop zitten en kijk vooruit en draai je hoofd/lichaam/stoel. Kijk nu een beetje naar beneden. U hebt eerst geroteerd op een echte LineUp -as en vervolgens de op/neer-transformatie toegepast. Leuk ja?

Een goede manier om na te denken over matrixtransformaties is als een instructieset die op orde moet zijn.

  1. Draai het hoofd naar rechts. ( ROTY )
  2. Draai het hoofd omhoog. ( rotX )
  3. Verplaats naar computer ( translate )
  4. ... etc

Als u de volgorde van één bewerking wijzigt, worden alle volgende instructies op grappige en buitensporige manieren gewijzigd.

Wat u aan het bouwen bent, is een camera, dus ik raad u ten zeerste aan te lezen hoe u er een bouwt .

Een geweldige oefening om matrixtransformaties te begrijpen, is het bouwen van een zonnestelsel, compleet met baanmanen en planeten. Het zal oog openen en zeer informatief zijn.

2
toegevoegd