Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

08.08.2006, 20:24

Objekt mit Kamera bewegen Aufgabe 2.7.6 Seite 185

Hallo zusammen!

Wie kann ich es bewerkstelligen, dass sich ein Object wie z.B. ein Würfel meiner
Kamerabewegung folgt?

Im Buch auf Seite 185, Aufbage 2 (Kapitel 2.7.6) sollte man das Beispielprogramm so anpassen,
dass der Würfel meiner Kamerabewegung (hier Drehung nach LINKS oder RECHTS) folgt. Der Tipp war, dass man den Verbindungsvektor von der
Kamera zum Würfel berechnet und multipliziert mit Zeit und dem Faktor 0.01 zum Bewegungsvektor des
Würfels addiert. Wäre das so richtig:


( Code-Schnippsel aus der Funktion Move(...) )

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(int iCube = 0; iCube < g_iNumCubes; iCube++) {

    //Verbindungsvektor

    vCameraCube = g_aCube[iCube].vPosition - g_vCameraPosition;

    //Addieren zum Bewegungsvektor

    g_aCube[iCube].vVelocity += (vCameraCube * 0.01f);

    //Zeit berücksichtigen

    g_aCube[iCube].vPosition += g_aCube[iCube].vVelocity * fNumSecsPassed;
    fDistance = tbVector3Length(g_aCube[iCube].vPosition);

    if(fDistance > 100.0f) g_aCube[iCube].vVelocity *= -1.0f;
}


Bei mir pulsieren die Würfel nur wie wild, und fliegen hin und her, ist zwar auch irgendwie
schön anzuschauen, aber eben nicht das was ich möchte :-) .


Vielleicht habe ich den Tip auch nur falsch verstanden?


Gruß
snooper

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

2

08.08.2006, 21:44

Du willst das ein Objekt deiner Kamerabewegung folgt? Normalerweise will man, dass die Kamera dem Objekt folgt, also bist du sicher, dass du willst was du hier schreibst.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

3

08.08.2006, 22:05

Hi,

ich bin mir sicher das ich will was ich hier schreibe :-) ,
der Aufgabenstellung zufolge soll das so sein!

Auf Seite 185, Übungsaufgabe 2 steht:

Zitat


Erweitern Sie das Programm aus Aufgabe1 so, dass die Würfel der Kamera folgen.
Tipp:
Berechnen Sie den Verbindungsvektor von jedem Würfel zur Kamera, und addieren Sie ..... [ wie oben beschrieben]



Gruß
snooper

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

4

08.08.2006, 22:42

Re: Objekt mit Kamera bewegen Aufgabe 2.7.6 Seite 185

Oh, Übungsaufgaben. Du musst wohl 'ne neuere Version haben also schauen wir uns das mal an:

Zitat von »"snooper"«

//Verbindungsvektor
vCameraCube = g_aCube[iCube].vPosition - g_vCameraPosition;

vCameraCube ist also der Vektor von der Kamera zum Würfel.

Zitat von »"snooper"«

//Addieren zum Bewegungsvektor
g_aCube[iCube].vVelocity += (vCameraCube * 0.01f);

Die Geschwindigkeit des Würfels ist also ein hundertstel von vCameraCube. vCameraCube zeigt allerdings von der Kamera weg. Somit bewegt sich der Würfel auch von der Kamera weg und nicht zur Kamera zu. Ausserdem wird die Geschwindigkiet des Würfels exponentionell vergrössert.

Zitat von »"snooper"«

//Zeit berücksichtigen
g_aCube[iCube].vPosition += g_aCube[iCube].vVelocity * fNumSecsPassed;

s=s0+v*t => Alles normal.

Zitat von »"snooper"«

fDistance = tbVector3Length(g_aCube[iCube].vPosition);

if(fDistance > 100.0f) g_aCube[iCube].vVelocity *= -1.0f;

Wieso das da drin ist kann ich jetzt wirklich nicht nachvollziehen. Ist der Würfel mehr als 100 Einheiten vom Koordinatenursprung entfernt wird seine Geschwindigkeit ruckartig umgekehrt.

So sollte es also funktionieren:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
for(int iCube = 0; iCube < g_iNumCubes; iCube++) {

    //Verbindungsvektor

    vCameraCube = g_vCameraPosition - g_aCube[iCube].vPosition;

    //Addieren zum Bewegungsvektor

    g_aCube[iCube].vVelocity = (vCameraCube * 0.01f);

    //Zeit berücksichtigen

    g_aCube[iCube].vPosition += g_aCube[iCube].vVelocity * fNumSecsPassed;
}


Jetzt zeigt vCameraCube also vom Würfel zur Kamera. Ausserdem ist bei der Geschwindigkeit nicht += sondern nur =. Somit wird der Würfel pro Sekunde um einen hundertstel seines Abstandes zur Kamera auf die Kamera zubewegt. So folgen die Würfel der Kamera immer und sind schnell wenn die Kamera weit entfernt ist und langsam wenn sie nach ist. Sie werden die Kamera also nie ganz erreichen (durch die Unstetigkeit der Render-Vorgänge natürlich schon, aber theoretisch nicht).
Allerdings ist ein hundertstel sehr langsam und ich würde das *0.01f einfach weglassen oder durch *0.5f ersetzen . Dies führt zu einer flotteren Annäherung...
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

5

08.08.2006, 23:21

Jo, hat funktioniert allerdings etwas anders als ich mir das vorgestellt habe.

Die Würfel folgen nun der Kamera, wenn sie nach VORN oder ZURÜCK bewegt wird, bis zu dem Punkt an dem sie sich alle zu einem Würfel überlagern. Alle diese überlagerten Würfel (nur als einer sichtbar) folgen nun der Kamera.
-> Das war dann vermutlich auch das Ziel der Aufgabe.

Ich dachte es sollte so laufen, dass sobald die Kamera nach LINKS gedreht wird, sich alle Würfel ebenfalls nach LINKS mit der Kamera drehen und bei einer rechts Drehung eben anders.

Kann dies nicht mit einer einfachen Rotation der Würfel um den veränderten Winkel der Kamerablickrichtung geschehen? Wenn das der falsche Ansatz ist könntest du mir vielleicht einen Tipp geben, wie man so etwas bewerkstelligen kann?


übrigens die Zeile ...

C-/C++-Quelltext

1
    if(fDistance > 100.0f) g_aCube[iCube].vVelocity *= -1.0f;


war noch Teil der 1. Aufgabe auf Seite 185 und wurde aus purer Neugier hier ebenfalls verwendet, ist also somit für diese Aufgabe belanglos.

Danke für die schnelle Antwort
snooper

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

6

08.08.2006, 23:27

Zitat von »"snooper"«

Kann dies nicht mit einer einfachen Rotation der Würfel um den veränderten Winkel der Kamerablickrichtung geschehen? Wenn das der falsche Ansatz ist könntest du mir vielleicht einen Tipp geben, wie man so etwas bewerkstelligen kann?

Doch das kann man so machen. Allerdings geht das dann auch einfacher und schneller. Denn wenn der Würfel alle Bewegungen und Drehungen der Kamera mitmacht ist er immer an der exakt selben Position auf dem Bildschirm. Du kannst also auch einfach die Kameramatrix für die Würfel auf die Matrix setzen, die die Kamera am Anfang des Programms räpresentierte, und für den Rest der Szene (ich schätze mal in deiser Übungsaufgabe gibt es keinen Rest) die aktuelle Kameramatrix verwenden. So bleiben die Würfel auch immer am gleichen Ort, während sich die Szene entsprechend der Kamerabewegung verschiebt...
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

7

09.08.2006, 12:21

Ja stimmt eigendlich, solange der Hintergrund schwarz ist und nur Würfel zu sehen sind, die sich entsprechend der Kamerabewegung anpassen macht es keinen Sinn.

Will man aber erreichen, dass die Würfel langsam der Kameradrehung folgen müsste man die Rotation mit einem ähnlichen Faktor wie oben bei der VOR- und RÜCKWERTS- Bewegung multiplizieren oder?


Gruß
snooper

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

8

09.08.2006, 13:41

Dann benötigst du Rotationsgeschwindigkeit und kannst das dann analog zur Bewegungsgeschwindigkeit verrechnen.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

Werbeanzeige