8

お絵描きプログラムを作りました。すべてが期待どおりに機能します。でも絵を描いていると、たまに不思議なことが起こります。

アプリを実行し、画像上でマウスの左ボタンを押します。コードからポイントを引き出す必要があります。

glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, brushTextura);
glPointSize(100);
glVertexPointer(2, GL_FLOAT, 0,GLVertices);
glDrawArrays(GL_POINTS, 0, count);
glDisableClientState(GL_VERTEX_ARRAY);

押したところで。mouseDownmouseDown の位置を登録し、NSValue に変換して配列に送信し、描画する前に NSValue を CGPoint に抽出して GLfloat に送信し、glDrawArrays で描画できるようにします。しかし、画像のどこでマウスをクリックしても、座標 (0,0) に点が描画されます。その後、すべてが正常に機能します。画像を参照してください:

マウスクリック

これが最初の問題でした。2 つ目の問題は、それを使用してペイントすると (マウスをドラッグして押す)、描画されていない場所にポイントが表示されることがあります。画像:

マウスドラッグ

ドラッグし続けると消えます。ドラッグした後、再び表示され、再び消えます。等々。画像:

ここに画像の説明を入力

なぜそれが起こる可能性があるのですか?以下にコードを掲載します。


マウスダウン:

- (void) mouseDown:(NSEvent *)event
{
    location = [self convertPoint: [event locationInWindow] fromView:self];
    NSValue *locationValue = [NSValue valueWithPoint:location];
    [vertices addObject:locationValue];

        [self drawing];
}

マウスドラッグ:

- (void) mouseDragged:(NSEvent *)event
{
    location = [self convertPoint: [event locationInWindow] fromView:self];
    NSValue *locationValue = [NSValue valueWithPoint:location];
    [vertices addObject:locationValue];

        [self drawing];
}

描く:

- (void) drawing {
int count = [vertices count] * 2;
NSLog(@"count: %d", count);
int currIndex = 0;
GLfloat *GLVertices = (GLfloat *)malloc(count * sizeof(GLfloat));
for (NSValue *locationValue in vertices) {
    CGPoint loc = locationValue.pointValue;
    GLVertices[currIndex++] = loc.x;
    GLVertices[currIndex++] = loc.y;    
 }
glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, brushTextura);
glPointSize(100);
glVertexPointer(2, GL_FLOAT, 0, GLVertices);
glDrawArrays(GL_POINTS, 0, count);
glDisableClientState(GL_VERTEX_ARRAY);
}
4

3 に答える 3

7

count変数 (で使用されている変数glDrawArrays) をに設定していますが[vertices count] * 2、これは奇妙に思えます。

の最後の引数glDrawArraysは、描画する頂点の数ですが、コードでは、数値を 2 倍に設定しているように見えます (おそらく浮動小数点数だと思いましたか?)。これは、最初のcount頂点の後にゴミを描画しているだけであることを意味します。

于 2012-07-09T07:32:05.407 に答える
1

クリックした正確な位置に頂点がレンダリングされないという事実は、ビュー内のヒット ポイントを適切に決定していないという問題を示唆しているはずです。

コードには次のものがあります。

location = [self convertPoint: [event locationInWindow] fromView: self];

これは、ポイントが実際にはウィンドウに対して相対的であっても、ポイントをその座標 (self) から同じビューの座標 (self) に変換するようにビューに指示します。

ポイントをウィンドウの座標からビューに変換するには、その行を次のように変更します。

location = [self convertPoint: [event locationInWindow] fromView: nil];
于 2012-07-09T22:52:44.840 に答える
0

glDrawArraysの引数は、(GLenumモード、GLintファースト、GLsizeiカウント)として定義されます。

2番目の引数は、描画時に使用される頂点属性の最初のインデックスを定義します。頂点座標を不一致にする最初のインデックスとして1を渡します。私はあなたがそこに0が欲しいと思います。

http://www.opengl.org/sdk/docs/man/xhtml/glDrawArrays.xml

于 2012-07-05T20:59:52.820 に答える