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

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

11

14.04.2012, 23:43

Naja. Man kann die Translation natürlich auch einfach noch anschliessend machen. Der grosse Vorteil von homogenen Koordinaten und insbesondere Matrizen ist, dass man alles in einem in Hardware implementieren kann. Eine Matrix Multiplikation für alles. Abgesehen davon ist es aber nicht wirklich notwendig. Es macht es auf eine Art einfacher (auch für Projektionen), aber wirklich notwendig sind sie nicht.

12

15.04.2012, 08:41

Naja, notwendig ist der ganze Matrizen Kram eh nicht, man kann auch von Hand skalieren oder rotieren. Aber früher oder später wird man die Matrizen mal zur Grafikkarte schicken möchten (weil man eine Modelltransformationsmatrix berechnet hat), aber man möchte 2 Transformationen hintereinander schalten, wenn man sie jeweils als 3x3 Matrix + Translationsvektor gespeichert hat, wird es unnötig kniffelig, die zu kombinieren.
Außerdem wird man bei 4x4 Matrizen gezwungen, sich mit der 4ten Vektorkomponente auseinander zu setzen und Richtungsvektoren von Ortsvektoren zu unterscheiden. Und das ist verflixt wichtig, weil sonst entstehen komische Fehler (aus eigener Erfahrung: "Ich brauch einen 4ten Wert? Ach, 0 wirds schon tun"...)
Lieber dumm fragen, als dumm bleiben!

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

13

15.04.2012, 12:44

Ich schreibe auch noch ne Vector4 Klasse :) Für W kann ich dann in die Doku schreiben: 1: Ortsvektor 0: Richtungsvektor. Und um Vector3 in Vector4 umzuwandeln, kann ich so was verwenden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
Vector4 Vector3ToVector4(const Vector3& v, const bool bPosition)
{
    if(bPosition)
    {
        return Vector4(v, 1);
    }
    return Vector4(v, 0);
}

Oder ich überlade den () Operator. So habe ich mir das jetzt gedacht. OK? Oder eher nicht?
Danke.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

14

15.04.2012, 13:20

Ein Vektor ist etwas sehr allgemeines und ich würde da keinen weiteren Overhead als die 4 Koordinaten speichern. Was die Werge genau bedeuten würde ich dem Benutzer überlassen. Ist ja an sich nicht so kompliziert, dass man das noch irgendwie wrappen müsste.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

15

15.04.2012, 16:52

So hier jetzt die finale Version :)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
inline Vector3 operator * ( const Matrix& m,
                            const Vector4& v)
{
    return Vector4ToVector3(
        Vector4(    m.m11 * v.x + m.m21 * v.y + m.m31 * v.z + m.m41 * v.w,
                    m.m12 * v.x + m.m22 * v.y + m.m32 * v.z + m.m42 * v.w,
                    m.m13 * v.x + m.m23 * v.y + m.m33 * v.z + m.m43 * v.w,
                    m.m14 * v.x + m.m24 * v.y + m.m34 * v.z + m.m44 * v.w )
                    );
}

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Sp3iky

Treue Seele

Beiträge: 232

Beruf: Entwicklungsingenieur

  • Private Nachricht senden

16

15.04.2012, 18:18

Wozu brauchst du den Vec3 Rückgabewert?

Wenn du den Vektor nochmal transformieren willst, musst du ihn erst wieder in einen Vec4 umwandeln, damit er dann wieder in einen Vec3 umgewandelt wird.

Wenn du im 3D Raum arbeitest, solltest du nur vec4 und mat4x4 nutzen um alle Elemente zu beschreiben. Seien es nun Punkte, Richtungsvektoren oder Transformationsmatritzen.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

17

15.04.2012, 20:41

Es gibt 2 Versionen der Überladung ;) Vector4 und Vector3.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

18

15.04.2012, 21:07

So hier jetzt die finale Version :)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
inline Vector3 operator * ( const Matrix& m,
                            const Vector4& v)
{
    return Vector4ToVector3(
        Vector4(    m.m11 * v.x + m.m21 * v.y + m.m31 * v.z + m.m41 * v.w,
                    m.m12 * v.x + m.m22 * v.y + m.m32 * v.z + m.m42 * v.w,
                    m.m13 * v.x + m.m23 * v.y + m.m33 * v.z + m.m43 * v.w,
                    m.m14 * v.x + m.m24 * v.y + m.m34 * v.z + m.m44 * v.w )
                    );
}

Was soll das mit dem 4. Element?
Du berechnest es, nur um es dann wegzuwerfen? Oder was macht Vector4ToVector3?

(Falls diese Funktion eine Division durch W durchführt, so ist der Name der Funktion eindeutig schlecht gewählt, sie sollte dann eher "ProjectVector4" heißen!)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

19

15.04.2012, 22:04

@David siehe etwas weiter oben. Er macht keine Division.

@FSA:
Nichts für ungut, aber glaubst du wirklich, dass es eine gute Idee ist etwas zu implementieren, was du noch nicht verstehst? Benutz doch lieber eine fertige Implementierung. Dann verstehst du es vielleicht besser, als wenn du das selbst (falsch) machst.

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

20

15.04.2012, 22:24

Zitat

Was soll das mit dem 4. Element?
Du berechnest es, nur um es dann weg zuwerfen? Oder was macht Vector4ToVector3?

Ja das ist wohl nicht so gut :P

Zitat


Nichts für ungut, aber glaubst du wirklich, dass es eine gute Idee ist etwas zu implementieren, was du noch nicht verstehst? Benutz doch lieber eine fertige Implementierung. Dann verstehst du es vielleicht besser, als wenn du das selbst (falsch) machst.

Falsch? Wo ist mein Fehler? Nur weil es etwas unbedacht geschrieben ist? Ich glaube ich ziehe das "finale Version" nochmal zurück. Werde morgen nochmal dran arbeiten. Aber habe ich einen Fehler gemacht?
Danke

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige