Question

J'ai une simple classe IRenderable qui a des membres pour la position, l'échelle et la rotation:

XMFLOAT3 _position;
XMFLOAT3 _scaling;
XMVECTOR _rotation;

Je cherche à les mettre avec le constructeur. La première méthode donne ici une violation d'accès 0x00000000 en train de mettre _rotation (_position et _scaling sont tous deux très bien):

IRenderable() : _position(XMFLOAT3(0, 0, 0)), _scaling(XMFLOAT3(1, 1, 1)), _rotation(XMQuaternionIdentity()) { }

Faire un _rotation XMVECTOR * au lieu et à l'aide _rotation (nouveau XMVECTOR ()) dans les jeux de constructeur il à un XMVECTOR vide, mais jette alors une violation d'accès plus tard en essayant de définir l'identité Quaternion:

*_rotation = XMQuaternionIdentity();

En utilisant l'adresse du XMQuaternionIdentity dans le constructeur fonctionne très 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 le quaternion lui-même contient des données des déchets au moment où il doit être utilisé pour rendre avec. Les deux _position et _scaling fonctionnent bien dans toutes ces situations.

Quelle est la correcte façon d'utiliser XMVECTOR dans cette situation?

Était-ce utile?

La solution 2

Pour contourner le bug Eitenne mentionné, j'ai simplement fait une struct axisAngle:

struct AxisAngle {
    XMFLOAT3 Axis;
    float Angle;

    AxisAngle() : Axis(XMFLOAT3(0, 0, 0)), Angle(0) { }

    AxisAngle(XMFLOAT3 axis, float angle) {
        Axis = axis;
        Angle = angle;
    }
};

L'utilisation de ce à la place du XMVECTOR pour la rotation, puis au moment du rendu juste en utilisant ce qui suit pour obtenir la matrice de rotation:

XMMATRIX rotation = XMMatrixRotationNormal(XMLoadFloat3(&_rotation->Axis), _rotation->Angle);

Il est évident que ce n'est une solution de contournement et les besoins réels de solution à fixer dans le compilateur pour permettre aux frontières de 16 bits sur le tas pour XMVECTOR.

Autres conseils

En général, vous devriez éviter d'utiliser XMVECTOR dans un struct. Les classes XMFLOAT # sont les classes de stockage, et doivent être utilisés pour le stockage général. Vous pouvez cependant utiliser le XMVECTOR si vous déclarez la structure alignée.

http://msdn.microsoft.com/en-us/library/83ythb65.aspx

__ declspec (align (16)) struct A {XMVECTOR a, b, c, d, e; };

mais je crois que si vous faites cela, chaque structure qui a un A en elle, doit également être aligné 16 octets (ou 32, 48, etc.). En général, il est beaucoup plus facile et plus clair d'utiliser les classes de stockage, et juste convertir au XMVECTOR ou XMMATRIX lorsque vous allez faire un calcul (XMLoadFloat4) et le stockage de nouveau dans un # de XMFLOAT (XMStoreFloat4), ou lorsque vous prenez valeurs pour les fonctions (assurez-vous de lire http: // msdn .microsoft.com / fr-fr / bibliothèque / windows / bureau / ee418728 (v = vs.85) .aspx ), ou le retour des valeurs de fonctions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top