Comment utiliser correctement un XMVECTOR variable membre
J'ai un simple IRenderable classe qui a des membres pour la position, l'échelle et la rotation:
XMFLOAT3 _position;
XMFLOAT3 _scaling;
XMVECTOR _rotation;
Je tente de les définir avec le constructeur. La première méthode donne ici une violation d'accès 0x00000000 en essayant de mettre en _rotation (_position et _scaling sont toutes les deux très bien):
IRenderable() : _position(XMFLOAT3(0, 0, 0)), _scaling(XMFLOAT3(1, 1, 1)), _rotation(XMQuaternionIdentity()) { }
Faire _rotation un XMVECTOR* au lieu et à l'aide de _rotation(nouveau XMVECTOR()) dans le constructeur définit un vide XMVECTOR, mais jette alors une violation d'accès ultérieurement, lorsque vous essayez de définir l'identité de Quaternions:
*_rotation = XMQuaternionIdentity();
À l'aide de l'adresse de l'XMQuaternionIdentity dans le constructeur fonctionne bien lors de la création de l'objet,
IRenderable() : _position(new XMFLOAT3(0, 0, 0)), _scaling(new XMFLOAT3(1, 1, 1)), _rotation(&XMQuaternionIdentity()) { }
mais alors le quaternion lui-même contient des données incorrectes par le temps, elle doit être utilisée pour le rendu avec. Les deux _position et _scaling fonctionnent très bien dans toutes ces situations.
Quel est le corriger façon d'utiliser XMVECTOR dans cette situation?
- Ressemble à un bug avec
XMVECTOR
lui-même: asawicki.info/news_1429_xna_math_and_access_violation.html
Vous devez vous connecter pour publier un commentaire.
En général, vous devriez éviter d'utiliser XMVECTOR dans une struct. Le XMFLOAT nombre de classes sont les classes de stockage, et doivent être utilisées pour le stockage. Vous pouvez cependant utiliser le XMVECTOR si vous déclarez la structure alignés.
http://msdn.microsoft.com/en-us/library/83ythb65.aspx
mais je crois que si vous le faites, chaque structure a un Une dans il, doit également être de 16 octets aligné (ou 32, 48, etc). En général, il est beaucoup plus facile et plus clair d'utiliser les classes de stockage, et de convertir de la XMVECTOR ou XMMATRIX lorsque vous allez faire certains calculs (XMLoadFloat4) et le stockage de retour dans un XMFLOAT# (XMStoreFloat4), ou lorsque vous prenez en valeurs pour les fonctions (assurez-vous de lire http://msdn.microsoft.com/en-us/library/windows/desktop/ee418728(v=vs. 85).aspx ), ou des valeurs de retour des fonctions.
Pour contourner le bug Eitenne mentionné, j'ai simplement fait un AxisAngle struct:
Utiliser cela à la place de la XMVECTOR pour la rotation, puis au temps de rendu en utilisant simplement le suivant pour obtenir la matrice de rotation:
Évidemment ce n'est qu'une solution de contournement et la vraie solution doit être corrigé dans le compilateur pour permettre à la 16 bits de limites sur le tas pour XMVECTOR.