0

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() メソッドの位置が変更されているのはなぜかわかりません。どちらも同じことを呼び出しているからです。

助けてくれてありがとう

4

2 に答える 2

2

ここにはいくつかの大きな問題があります。

GameObject *go = new GameObject();
go = this->data;

新しいオブジェクトを作成していて、そのオブジェクトへのポインターを忘れています。これは render を呼び出すたびに発生するため、使用していない大量のメモリが時間とともに増加します。あなたはただ言うことができます:

GameObject *go = NULL;

データを割り当てずにポインタを作成します。

this->foo はどこでも省略できます。これは、すべてのクラス内で暗示されます。

したがって、このコードでエラーを確認することはできませんが、上記のようなポインターで間違いを犯しているため、別の場所にある可能性があります。おそらく、描画していないものを指しているポインターがあるでしょう。更新中のもののメモリ アドレスと render() で更新中のもののメモリ アドレスを見ると、実際には異なる場合があります。そうであれば、描画しているのと同じものに対して update を呼び出していないことがわかります。メモリ アドレスを取得するには、関数呼び出し内の「this」の値を確認します。それらを書き留めて、描画しているオブジェクトと同じであることを確認してください。エラーはこのコードにはありません。

于 2010-02-20T16:08:23.443 に答える
0

SceneNode では、this-> data を go に割り当てると、実質的に go を null に設定しています! その割り当てを取り出すか、go を使用する代わりに this->data = new GameObject() を実行します。

于 2010-02-20T16:13:05.083 に答える