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

Klaus

Treue Seele

  • »Klaus« ist der Autor dieses Themas

Beiträge: 245

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

1

26.06.2004, 02:27

Bug in tbSpriteEngine::AddSprite?

Hallo

Also ich bin hier ja wie viele andere auch grade am zusammenbasteln meiner eigenenen Engine aus Tribase Schnipseln und Selbstgemachtem.
Ich muss eben von daher alles neu schreiben und kann nichts direkt kopieren, weil ich es in C# für Managed DirectX mach *grins*.

Nun ja, ich bin da jetzt auf was gestoßen, und ich glaub, das ist ein (Denk-)Fehler in der TriBase:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dcVector3 xAxis = cameraXAxis;
dcVector3 yAxis = cameraYAxis;

if(!Simple)
{
    yAxis = dcVector3.Cross(new dcVector3((float)Math.Cos(Rotation), (float)Math.Sin(Rotation), 0.0f), cameraZAxis);
    xAxis = dcVector3.Cross(yAxis, cameraZAxis);
}

dcVector3 sizeX = ((xAxis * (float)Math.Cos(-Rotation) * Size.x) + (yAxis * (float)Math.Sin( Rotation) * Size.x)) * 0.5f;
dcVector3 sizeY = ((xAxis * (float)Math.Sin(-Rotation) * Size.y) + (yAxis * (float)Math.Cos(-Rotation) * Size.y)) * 0.5f;

vertices[0].SetPosition(Position - sizeX + sizeY);
vertices[1].SetPosition(Position + sizeX + sizeY);
vertices[2].SetPosition(Position + sizeX - sizeY);
vertices[3].SetPosition(Position - sizeX - sizeY);

(Is zwar C# und kein C++, aber das solltet ihr trotzdem alle lesen können ;))
Ach ja, ich hab da ja auch noch was geändert, mit dem "if (Simple)", aber ich weiß nich, ob das schneller is oder was auch immer - es schien mir einfach praktischer.

Das Wichtige ist jetzt das Size.x und Size.y. Wenn das nämlich so vertauscht ist, wie in der TriBase...:

C-/C++-Quelltext

1
2
vSizeX = ((vXAxis * cosf(-fRotation) * vSize.x) + (vYAxis * sinf(fRotation) * vSize.y)) * 0.5f;
vSizeY = ((vXAxis * sinf(-fRotation) * vSize.x) + (vYAxis * cosf(-fRotation) * vSize.y)) * 0.5f;


... dann laufen die Vertices bei der Rotation in zwei verschobenen Ovalen, anstatt auf einem gemeinsamen Kreis.
Wenn es wirklich ein Fehler ist, dann ist es wahrscheinlich deshalb bisher nicht aufgefallen, weil es ja gar kein Problem ist, wenn man nur quadratische Sprites benutzt, wie das ja meistens der Fall ist.

Also gut, jetzt hab ich dazu viel mehr geschrieben, als nötig gewesen wäre, aber das musste einfach sein, nachdem ich da sooo lange dran gesessen und halb verzweifelt bin, weil die blöde Rotation nicht getan hat... :rolleyes:


bye
Klaus

PS: Ich hoff, das hat nicht schon jemand anders bemerkt und gepostet, aber eine Suche nach "AddSprite" hier im Forum hat mir nichts entsprechendes gezeigt. ;)

Oh, PPS!:
Ich hab noch was vergessen!
Normal is ja y der Sinus und x der Cosinus, nich?
Also ist ...:

C-/C++-Quelltext

1
tbVector3 vYAxis(tbVector3Cross(tbVector3(sinf(fRotation), cosf(fRotation), 0.0f), m_vCamZAxis));

... auch nicht richtig.
Lösung siehe oben.
Mozilla Firefox
The Browser - reloaded

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

26.06.2004, 11:18

Re: Bug in tbSpriteEngine::AddVertex?

Super, danke für den Hinweis.
Aber bitte sag mir mal, was ich genau vertauschen soll. Gestern war Abi-Ball, und ich kann noch nicht richtig klar denken *g*

Zitat von »"Klaus"«

Normal is ja y der Sinus und x der Cosinus, nich?

Nee, das ist schon richtig so.
Bei Winkel 0 ist y = cos(0) = 1 und x = sin(0) = 0.

Klaus

Treue Seele

  • »Klaus« ist der Autor dieses Themas

Beiträge: 245

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

3

26.06.2004, 17:09

Re: Bug in tbSpriteEngine::AddVertex?

Zitat von »"David Scherfgen"«

Super, danke für den Hinweis.
Aber bitte sag mir mal, was ich genau vertauschen soll. Gestern war Abi-Ball, und ich kann noch nicht richtig klar denken *g*


*gg* Ich geh heute noch auf n Abi Ball. Allerdings nicht mein eigener, sondern der der Stufe höher. Ich hab ja noch ein Jahr ;) :)

Wegen dem Vertauschen:
Das ist falsch:

C-/C++-Quelltext

1
2
vSizeX = ((vXAxis * cosf(-fRotation) * vSize.x) + (vYAxis * sinf(fRotation) * vSize.y)) * 0.5f;
vSizeY = ((vXAxis * sinf(-fRotation) * vSize.x) + (vYAxis * cosf(-fRotation) * vSize.y)) * 0.5f; 


Das ist richtig:

C-/C++-Quelltext

1
2
vSizeX = ((vXAxis * cosf(-fRotation) * vSize.x) + (vYAxis * sinf(fRotation) * vSize.x)) * 0.5f;
vSizeY = ((vXAxis * sinf(-fRotation) * vSize.y) + (vYAxis * cosf(-fRotation) * vSize.y)) * 0.5f; 


Zitat von »"David Scherfgen"«

Zitat von »"Klaus"«

Normal is ja y der Sinus und x der Cosinus, nich?

Nee, das ist schon richtig so.
Bei Winkel 0 ist y = cos(0) = 1 und x = sin(0) = 0.


Sicher?
ich meine, du bildest doch das Kreuzprodukt aus der Z-Achse der Kamera, die ja vorgegeben ist (bzw., die man aus der übergebenen View-Matrix auslesen kann) und einer selbst errechneten X-Achse. Damit kommt also die Y-Achse raus:

C-/C++-Quelltext

1
yAxis = dcVector3.Cross([Errechnete X-Achse], KameraZAchse);


Nach dem, was du oben schreibst, hast du dann aber bei 0° den Vektor (sin(0) | cos(0) | 0) = (0 | 1 | 0) gebildet, der nach oben zeigt und meiner Meinung nach eher als Y-Achse bezeichnet werden könnte, als als X-Achse, oder? Ansonsten ist das gesamte Sprite ja um 90° um seine Z-Achse gedreht.

Vielleicht hab ich auch einfach nur noch was übersehen, das kann schon sein, aber ich weiß auf jeden Fall noch ganz sicher, dass beim Einheitskreis immer galt: y = sin; x = cos.

bye
Klaus
Mozilla Firefox
The Browser - reloaded

adapto

Treue Seele

Beiträge: 147

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

4

26.06.2004, 17:56

Zitat

beim Einheitskreis immer galt: y = sin; x = cos


das stimmt

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

26.06.2004, 19:41

Ihr habt recht. Ich war davon ausgegangen, dass es sich um die x-Achse handeln soll. Aber es war ja die y-Achse... ok. Ich ändere es. Die Änderung kommt übrigens gerade noch rechtzeitig *g*

Werbeanzeige