dポイントプレゼントキャンペーン実施中!

BorlandC++Builder4を使っています。

OpenGLを使って3次元グラフィックを扱うソフトの開発を目標にしており、勉強を始めたばかりなのですが、現在は最終目標の前段階として、OpenGLを使って2次元のペイントソフトを作ろうとしています。

【プログラムの機能・概要】
・マウスを使っての描画
・消しゴムのような消去機能
・指定範囲内の描線の切り取り&移動機能

他にも色の取得や選択など機能を追加していく予定ではありますが、とりあえず上の3つの基本機能を作ろうとしています。切り取り&移動は消去機能が完成した後かな、という感じです。

【プログラムの骨子】
・OpenGLPanelとTimerをForm上に配置
・OnMouseDownイベント時に、左クリックで描画開始、右クリックでクリックした座標の指定した範囲の周囲にある描線を消去開始
・OnMouseMoveイベント時に、左クリックしている間は描線表示、右クリックでクリックしている間は周囲の描線を消去
・OnMouseUpイベント時に、左クリックUpで描画終了、右クリックUpで消去終了
・Timerで、描画中のマウス座標を指定時間ごとに記録

考えたのはこんな感じなんですが、これでペイントソフトとして機能させることは可能でしょうか?足りない部分があれば指摘をお願いします。

【わからないこと】
・座標の記録方法(どのような関数を用いてどんな風に記述すればよいか)
・OnMouseDown、OnMouseMoveの各イベントで、保存した座標を呼び出す方法

glVertex*()を使うことになると思うんですが、具体的にどのように記述すればいいのかわかりません。

ちょっと混乱していて質問自体におかしいところが多いかもしれませんが、どんなことでも構わないのでアドバイス宜しくお願いします。

A 回答 (2件)

OpenGLでは特に設定をしない限り、


画面の右向きが+x方向、上向きが+y方向、奥向きが-z方向で、
それぞれ-1.0から1.0までの範囲が「見える」範囲になります。

ところがMouseMoveで渡されるX,Yは、例えばウィンドウサイズが640*480だと、
ウィンドウ内ではXが0から640なので、OpenGLの範囲にはまず入りません。

簡単なのはX,Yを-1.0から1.0に修正して使う方法で、
double x=(double)(X-center_x)/width;
double y=(double)(center_y-Y)/width;
としてglVertex*に渡す。


しかし、OpenGLでの「見える」範囲を変更するのは必ず必要になるので
glOrtho, glPerspective, gluLookAt, glViewport
等についてはよく知っておく必要があるでしょう。


マウス移動時に線を引き続けることについては
ダブルバッファをオフにして毎回、前回の位置から今回の位置まで線を引くか、
点の位置を全部覚えて、再描画のたびに全部描くかだと思います。
点を書くにはglBegin(GL_POINTS), glPointSize()があります。

この回答への補足

大変参考になりました。

実はOpenGLの様々な参考文献を見ていくと、サンプルプログラムなどで必ず線分の範囲が-1.0~1.0の範囲内でしたので、なぜそれ以上の値がないのだろうと考えていました。glVertex()を使ってただ四角形を表示するような簡単なプログラムを作っても、見えるようにするためにZ軸の座標を色々試してみないと表示されていることを確認できなかったのはこれが原因ですね。glPerspectiveで指定したらきちんと表示されるようになりました。

マウス移動時の線描画に関しても、指摘していただいた方法を試してみようと思います。

また分からないことがあれば聞かせていただきたいと思います。ありがとうございました。

補足日時:2004/12/09 10:59
    • good
    • 0

3次元グラフィックを扱うソフトとペイントソフトはかなり毛色が違うと思います。


3次元だと線分や面を扱い、ペイントは点を扱うという感じですから。
二次元扱う場合でもCAD、ドロー系の線を扱うソフトの方が近いでしょう。
あと、OpenGLではペイントソフトは向きません。
基本的に線と面を扱うためのものなので、点を扱うのは不適切です。そもそも点を書く関数がなかったと思いますが。


わからないことですが、あまりに漠然としてて答え難いですね。どうにでもできるとか、いろいろあるとしか言えません。
もう少し自分が書きたいプログラムの内容を具体的に考えてみてください。

この回答への補足

現在すでに3次元に線を描くソフトが先輩方によって開発済でして、これに色々な機能を付け加えたり、場合によってはプログラム自体を書き直すための準備段階なんです。

ペイントソフトという言い方が悪かったのかもしれませんが、なんにせよ、もう少し勉強する必要がありそうですね。

ご指摘ありがとうございました。

補足日時:2004/12/09 10:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!