OpenGL でこれらのオブジェクトのレンダリングと描画を制御できるように、いくつかのオブジェクトを保持する単純なシーン グラフを作成しています。私は 2 つのクラスを持っています。1 つは GameObject と呼ばれ、位置や速度などの特定のパラメーターとオブジェクトの描画方法を定義するオブジェクトです。update() と呼ばれるメソッドがあり、位置の変更を計算し、draw() を呼び出して画面に描画します。
別のクラスは、sceneNode と呼ばれます。このクラスは、オブジェクトを格納するために使用するデータ構造を制御します。このクラスのインスタンスには、GameObject インスタンスへのポインターが含まれているため、データにアクセスできます。また、sceneNode には、vector に格納された sceneNode 型の子があります。
各クラスは、単独で完全に機能します。シーン グラフなどに子を追加し、GameObject を作成して、それ自体を描画するように指示すると、すべてが期待どおりに機能します。
次に、render() と呼ばれる新しいメソッドを SceneNode に追加しました。このメソッドは、gameObject へのポインターを取得し、ノードの子に対して render() を呼び出す前に更新関数を呼び出します。
問題は、update() メソッドが呼び出され、GameObject が描画されるが、常に同じ場所に描画され、速度と位置の変化があるにもかかわらず動かないことです。GameObject DOES のインスタンスを使用して update() 関数を呼び出すと、オブジェクトが描画され、画面上でオブジェクトが移動します。私はこのコードを何時間も見つめていましたが、何が欠けているのかわかりません。私はポインタと別のクラスからのメソッドの呼び出しのアイデアにまだかなり慣れていないので、明らかなことを見落としている可能性があります。
関連するメソッドは次のとおりです。
GameObject.cpp: 変数の位置、速度などは保護されているものとしてリストされています。
void GameObject::update(){
for (int i = 0; i<3;i++){
this->velocity[i] +=this->acceleration[i];
}
this->position[0] += this->velocity[0];
this->position[1] += this->velocity[1];
this->position[2] += this->velocity[2];
this->draw();
}
void GameObject::draw() {
glTranslatef(this->position[0], this->position[1], this->position[2]);
glBegin(GL_TRIANGLES);
for (int i = 0; i < this->num_tris; i++) {
for (int j = 0; j <3 ; j++) {
glVertex3fv(vertices[triangles[i].INDEXES[j]]);
}
}
glEnd();
}
シーンノード.cpp:
void sceneNode::render(){
GameObject *go = new GameObject();
go = this->data;
//data is the name of the variable storing a pointer to a GameObject
go->update();
//update() is a method that redraws the object and calc's new position etc
if (hasChildren()) { //if this node has children, render all of them aswell...
for (int i = 0; i< this->node_tree.size(); i++) {
this->node_tree.at(i).render();
}
}
sceneNode.h: これは、ゲーム オブジェクト ポインターがシーン ノードで設定される方法です。
Protected:
GameObject* data;
render() メソッドの位置が変更されていないのに update() メソッドの位置が変更されているのはなぜかわかりません。どちらも同じことを呼び出しているからです。
助けてくれてありがとう