J'essaye d'utiliser OpenGL pour démontrer l'animation hiérarchique. Au début, j'essaie de donner à mon objet "osseux" une référence à son parent.Accédez à l'emplacement de lecture de violation 0xFFFFFFFFFFFFFFFF
Dans ma classe d'os, je peux ajouter un parent avec succès mais le problème est quand j'appelle hasParent()
. Il ne peut pas lire this-> parent et accidents à l'exception suivante:
exception non gérée à 0x00007FF6CB723D43 dans myprogram.exe: 0xC0000005: violation. Accès lieu de lecture 0xFFFFFFFFFFFFFFFF **
Snippets de mon classe d'os:
void Bone::addParent(Bone *bone)
{
this->parent = bone;
assert(this->parent);
}
bool Bone::hasParent()
{
assert(this->parent); //this line causes the error
if (this->parent)
return true;
else return false;
}
glm::mat4 Bone::getBoneModel()
{
glm::mat4 parentModel = glm::mat4(1.0);
if (hasParent())
parentModel = parent->getBoneModel();
//boneModel = parentModel * boneModel;
return boneModel;
}
dépouillée contenu de mon principal:
#define NUMBONES 3
Bone bone[NUMBONES];
int main(void)
{
//------------------ Create Bones --------------------------
float y = 0.0f;
for (int i = 0; i < NUMBONES; i++)
{
bone[i] = Bone(i, vec3(0, y, -30), vec3(0, 0, 0), vec3(0, 0, 0));
y += 5.0f;
}
//----------------- Make relationships ----------------
bone[0].isRoot = true;
bone[0].addChild(&bone[1]);
bone[0].addChild(&bone[2]);
bone[1].addParent(&bone[0]);
bone[1].addChild(&bone[2]);
bone[2].addParent(&bone[1]);
do{
ModelMatrix = bone[1].getBoneModel();
}
return 0;
}
Je trouve les références et les pointeurs difficiles à comprendre, alors j'espère que c'est évident pour quelqu'un d'autre!
EDIT:
Mes constructeurs:
Bone::Bone() {
parent = NULL;
child = NULL;
boneID = 0;
boneModel = glm::mat4(1.0);
}
Bone::Bone(int ID, glm::vec3 T, glm::vec3 R, glm::vec3 S)
{
boneID = ID;
isRoot = false;
pos = T;
//---------- set boneModel ------------------
glm::mat4 RotationMatrix = glm::mat4(1.0);
glm::mat4 TranslationMatrix = translate(glm::mat4(), pos);
glm::mat4 ScalingMatrix = scale(glm::mat4(), glm::vec3(1.0f, 1.0f, 1.0f));
boneModel = TranslationMatrix * RotationMatrix * ScalingMatrix;
std::cout << "bone[" << boneID << "] created.\n";
}
Vous pouvez trouver cela beaucoup plus facile si vous exécutez ceci dans le débogueur, et obtenez une trace de la pile d'où l'erreur s'est produite. –
Veuillez montrer le constructeur de la classe 'Bone'. Est-ce qu'il initialise 'parent'? –
Quelle ligne de code provoque la panne? – wallyk