Wie man richtig mit einem XMVECTOR member-variable
Habe ich eine einfache IRenderable Klasse, die Mitglieder hat, die position, Skalierung und rotation:
XMFLOAT3 _position;
XMFLOAT3 _scaling;
XMVECTOR _rotation;
Ich bin versucht, Ihnen mit der Konstruktor. Die erste Methode, hier gibt eine Zugriffsverletzung, 0x00000000 versuchen, _rotation (_position und _scaling sind beide in Ordnung):
IRenderable() : _position(XMFLOAT3(0, 0, 0)), _scaling(XMFLOAT3(1, 1, 1)), _rotation(XMQuaternionIdentity()) { }
Machen _rotation eine XMVECTOR* statt und mit _rotation(neue XMVECTOR () in den Konstruktor legt Sie auf einen leeren XMVECTOR, aber dann löst eine Zugriffsverletzung, später, wenn Sie versuchen, um die Identität Quaternion:
*_rotation = XMQuaternionIdentity();
Unter der Adresse der XMQuaternionIdentity im Konstruktor funktioniert gut, wenn Sie das Objekt erstellen,
IRenderable() : _position(new XMFLOAT3(0, 0, 0)), _scaling(new XMFLOAT3(1, 1, 1)), _rotation(&XMQuaternionIdentity()) { }
aber dann das quaternion selbst Müll enthält Daten, die durch die Zeit, die es braucht, um verwendet werden, zu machen. Beide _position und _scaling sind in Ordnung, die in all diesen Situationen.
Was ist der richtige Weise zu verwenden XMVECTOR in dieser situation?
XMVECTOR
selbst: asawicki.info/news_1429_xna_math_and_access_violation.htmlInformationsquelleAutor mikeschuld | 2011-07-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen sollten Sie vermeiden, mit XMVECTOR in ein struct. Die XMFLOAT# - Klassen sind die storage-Klassen, und sollte verwendet werden, für Allgemeine Lagerung. Sie können jedoch die XMVECTOR, wenn Sie erklären, die Struktur ausgerichtet.
http://msdn.microsoft.com/en-us/library/83ythb65.aspx
aber ich glaube, dass, wenn Sie dies tun, dann ist jede Struktur, die eine Eine in es, muss auch die 16-byte-ausgerichtet (oder 32, 48 usw.). Im Allgemeinen ist es viel einfacher und klarer zu verwenden, die storage-Klassen, und nur konvertieren, um die XMVECTOR oder XMMATRIX, wenn Sie gehen, um einige der Berechnung (XMLoadFloat4) und zum speichern wieder in ein XMFLOAT# (XMStoreFloat4), oder wenn Sie in Werte für die Funktionen (Lesen Sie bitte http://msdn.microsoft.com/en-us/library/windows/desktop/ee418728(v=vs. 85).aspx ), oder zurückgeben von Werten aus Funktionen.
Richtig, aber Sie verwenden es in einer member-variable, wenn ich lese es richtig. Sollten Sie nur speichern Sie es als eine XMFLOAT4. Sie brauchen nichts zusätzliches. Nur tun XMStoreFloat4(&_rotation, XMQuaternionIdentity()) und haben _rotation ein XMFLOAT4
InformationsquelleAutor Michael
Arbeiten, um den Fehler Eitenne erwähnt, habe ich einfach ein AxisAngle struct:
Mit dieser an die Stelle der XMVECTOR für rotation und dann auf render-Zeit nur mit dem folgenden, um die rotation matrix:
Natürlich ist dies nur ein workaround und die wirkliche Lösung der repariert werden muss in den compiler zu ermöglichen, die 16-bit-Grenzen auf dem heap für XMVECTOR.
InformationsquelleAutor mikeschuld