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...
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.