BorlandC++Builder4を使っています。
OpenGLを使って3次元グラフィックを扱うソフトの開発を目標にしており、勉強を始めたばかりなのですが、現在は最終目標の前段階として、OpenGLを使って2次元のペイントソフトを作ろうとしています。
【プログラムの機能・概要】
・マウスを使っての描画
・消しゴムのような消去機能
・指定範囲内の描線の切り取り&移動機能
他にも色の取得や選択など機能を追加していく予定ではありますが、とりあえず上の3つの基本機能を作ろうとしています。切り取り&移動は消去機能が完成した後かな、という感じです。
【プログラムの骨子】
・OpenGLPanelとTimerをForm上に配置
・OnMouseDownイベント時に、左クリックで描画開始、右クリックでクリックした座標の指定した範囲の周囲にある描線を消去開始
・OnMouseMoveイベント時に、左クリックしている間は描線表示、右クリックでクリックしている間は周囲の描線を消去
・OnMouseUpイベント時に、左クリックUpで描画終了、右クリックUpで消去終了
・Timerで、描画中のマウス座標を指定時間ごとに記録
考えたのはこんな感じなんですが、これでペイントソフトとして機能させることは可能でしょうか?足りない部分があれば指摘をお願いします。
【わからないこと】
・座標の記録方法(どのような関数を用いてどんな風に記述すればよいか)
・OnMouseDown、OnMouseMoveの各イベントで、保存した座標を呼び出す方法
glVertex*()を使うことになると思うんですが、具体的にどのように記述すればいいのかわかりません。
ちょっと混乱していて質問自体におかしいところが多いかもしれませんが、どんなことでも構わないのでアドバイス宜しくお願いします。
No.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で指定したらきちんと表示されるようになりました。
マウス移動時の線描画に関しても、指摘していただいた方法を試してみようと思います。
また分からないことがあれば聞かせていただきたいと思います。ありがとうございました。
No.1
- 回答日時:
3次元グラフィックを扱うソフトとペイントソフトはかなり毛色が違うと思います。
3次元だと線分や面を扱い、ペイントは点を扱うという感じですから。
二次元扱う場合でもCAD、ドロー系の線を扱うソフトの方が近いでしょう。
あと、OpenGLではペイントソフトは向きません。
基本的に線と面を扱うためのものなので、点を扱うのは不適切です。そもそも点を書く関数がなかったと思いますが。
わからないことですが、あまりに漠然としてて答え難いですね。どうにでもできるとか、いろいろあるとしか言えません。
もう少し自分が書きたいプログラムの内容を具体的に考えてみてください。
この回答への補足
現在すでに3次元に線を描くソフトが先輩方によって開発済でして、これに色々な機能を付け加えたり、場合によってはプログラム自体を書き直すための準備段階なんです。
ペイントソフトという言い方が悪かったのかもしれませんが、なんにせよ、もう少し勉強する必要がありそうですね。
ご指摘ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- Windows 8 動画の再生とタイトルの変更方法を教えてください。 3 2022/08/01 14:51
- Excel(エクセル) 余計なお世話的な「入力規則」?対策は? 2 2023/01/14 12:39
- Windows 10 (緊急)windowsのタスクバーやアプリ?が反応しない 3 2023/03/28 05:03
- Illustrator(イラストレーター) 「頂点で線分を伸ばす」作業がうまく行かない。 1 2022/09/09 10:19
- Chrome(クローム) Chromeでgooglemap検索等結果が他国になってしまう 1 2022/10/05 12:18
- Windows 10 Windows10の不具合(Critical Process Died) 9 2022/04/19 21:11
- 美術・アート トレパク疑惑をかけられにくくするには ここ最近いわゆるトレパク警察のいいがかりがが厳しくなったようで 1 2023/08/21 09:59
- docomo(ドコモ) 通話録音が(最初から)自動的に始まるアプリは? 7 2023/01/16 15:53
- 画像編集・動画編集・音楽編集 WIN10で「切り取り&スケッチ」が上手く使えません。 1 2022/09/01 22:56
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBAで他アプリケーション...
-
外付ディスプレイで AutoHotkey...
-
VBA HTML要素または文字の座標...
-
UWSファイルの編集?
-
JPGの画像ファイルの結合
-
C#で、画像の、指定した座標の...
-
エクセルVBAで画像を貼り付ける...
-
バナーにリンクを埋め込む方法
-
LineTo,MoveToについて
-
マウスイベントが動かない
-
マウス自動クリックソフトについて
-
VBでクリックイベントを発生さ...
-
AUTO CAD2007で長方形(四角)を...
-
UWSCでPEEKCOLORを使い指定ウィ...
-
OpenGLを使ったプログラムについて
-
VB、VBSでのキーマクロ
-
クリックした点を中止に拡大・縮小
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
CloseとDisposeの違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで画像を貼り付ける...
-
Excel VBAで他アプリケーション...
-
C#で、画像の、指定した座標の...
-
VBでクリックイベントを発生さ...
-
バナーにリンクを埋め込む方法
-
UWSC画像認識で座標の位置がず...
-
マウスイベントが動かない
-
uwscについて、同一の画像(仮...
-
外付ディスプレイで AutoHotkey...
-
VBAで ScreenToClient を使いたい
-
UWSCで特定の文字をクリックす...
-
VBA HTML要素または文字の座標...
-
マウスストーカーのようにカー...
-
UWSファイルの編集?
-
NoxPlayerとUWSCのadbの座標に...
-
C言語でグラフ作成??
-
特定座標のRGB値取得について
-
UWSCのCHKIMG関数について
-
Visual Studio .NET 2003:右揃...
-
JPGの画像ファイルの結合
おすすめ情報