ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

何でもかんでもやってみようコミュのCAMソフトを作りたい

  • mixiチェック
  • このエントリーをはてなブックマークに追加
CAMソフトとは、工作機械(NC旋盤、マシニングセンター)で主に金属を加工するのに、その工作機械を動かすプログラム(NC文)を作るソフトです。

入力するデータ
 CADデータ(製品の形状)
  電子媒体の場合 CAMソフトに読み込む
  紙の加工図面の場合 CAMソフトで作図する

 加工部位の指定
 加工方法の指定
 使用工具、条件等の指定

出力するデータ
 NC文
  工具の経路の座標値、機械の動作を指定するGコード等
  を列記したテキスト文書

市販されているソフトに無い機能を盛込みたい。
 ・加工方法をカスタマイズ出来る
 ・工具、加工条件のデータは工具メーカーのHP等から常に
 最新情報を入手する

上記のようなソフトを作りたいと思っているのですが、
問題が沢山あります。

VB.NET GDIで円弧と線だけのワイヤーフレームモデルを表示して、拡大縮小、移動、回転すると 描画するのに時間が掛かるので、OPENGLを使いたいのですが、その方法が良く解りません。

CQ出版社の「OpenGL 3Dプログラミング」で勉強しようとしましたが、開発環境のバージョンが違うのか、サンプルが再現出来ず、挫折。 VBから呼び出して使いたかった。

何か良い参考書、資料等ないでしょうか?


言い訳
このところ、本業が忙しすぎてなかなか時間が取れません。
ゆっくりしか進めませんが、宜しくお願いします。






 

 

コメント(23)

CQ出版社の「OpenGL 3Dプログラミング」の環境はは、Visual Studio 6.0 & Windows98

私の所は、.NET2003 XP です。

どこが実行出来なかったか、もう一度チャレンジしてみます。
DirectXなどは駄目でしょうか?
そちらのほうが参考文献が多いうえ、MSのライブラリなのでVSとの相性もよさそうですが…。
飲む、呑む・・・さん
直に書き込んでくれていたのですね。
気がつきませんでした すみません。

DirectXは精度的に問題が有ると聞いたことがあります。
ゲーム等に使うには問題無いが、CADには不向きらしいのです。

線と線の交点等 最小単位 0.0001ミリまで必要なので、実際データとしてはもっと小さな数値まで必要になります。


その後
VBで呼び出すDLLをVC++で作る。で
本には、[プロジェクト]−[プロジェクトの追加]−[ファイル]で、"c:\Program Files\Microsoft Visual Studio\Vc98\Lib"にある"Opengl32.lib"を追加する とあります。

これを .NET2003でどのように再現したら良いか?
で止まっています。

以下 Cソースファイルをコピーします
/*--------------------------------------------------------------------
Pro3D3.c
1999/06/16 by K.Sakai
----------------------------------------------------------------------*/
#include <windows.h>
#include <gl\gl.h>

HGLRC hRC;//レンダリングコンテキストのハンドル

//自作関数
void myglInit(HDC hDC);
void display(void);

_declspec(dllexport) void _stdcall DrawSpace(HDC hDC)
{
myglInit(hDC); //初期設定
display(); //描画
SwapBuffers(hDC);//フレームバッファの切替
//終了のための後処理
wglMakeCurrent(hDC,NULL);//レンダリングコンテキストをカレントから外す
wglDeleteContext(hRC); //レンダリングコンテキストを削除
}
//-----------------------------------------------------------------
void myglInit(HDC hDC)
{
//ピクセルフォーマットの初期設定
PIXELFORMATDESCRIPTOR pfd = //ピクセルフォーマットの属性を定義
{
sizeof(PIXELFORMATDESCRIPTOR), //構造体のサイズ
1, //構造体のバージョン番号
PFD_DRAW_TO_WINDOW //特性フラグ
| PFD_SUPPORT_OPENGL
| PFD_DOUBLEBUFFER, //animation機能を使用
PFD_TYPE_RGBA, //カラーモード
24, //カラービット数(各色256モード)
0,0,0,0,0,0, //無関係
0,0,0,0,0,0,0, //アルファバッファとアキュムレーションバッファはなし
32, //32ビットデプスバッファ
0,0, //ステンシルバッファと補助バッファは使わない
PFD_MAIN_PLANE, //主レイヤタイプ
0, //予約されている
0,0,0 //サポートされていない
};
//上で決めたフォーマットに最も近いこのデバイスのフォーマットを得る
int pixelFormat = ChoosePixelFormat(hDC,&pfd);
//ピクセルフォーマットのセット
BOOL success = SetPixelFormat(hDC,pixelFormat,&pfd);
//レンダリングコンテキストのハンドルを得る
hRC = wglCreateContext(hDC);
//hRCをカレントとし、DCと結合する
wglMakeCurrent(hDC,hRC);
//背景色を白(すべて0.にすると黒)
glClearColor(1.0f,1.0f,1.0f,0.0f);
//カラーバッファとデプスバッファをクリア
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
}
//---------------------------------------------------------
//LIst3.1
/*
void display(void)
{
glColor3f(0.0f,0.0f,0.0f);
glPointSize(5.0f);
glBegin(GL_POINTS);
glVertex2f(0.0f,0.0f);
glVertex2f(0.8f,0.8f);
glVertex2f(-0.8f,0.8f);
glVertex2f(-0.8f,-0.8f);
glVertex2f(0.8f,-0.8f);
glEnd();
}
*/
//List3.3
void display(void)
{
//直線
glColor3f(1.0f,0.0f,0.0f);
glBegin(GL_LINES);
glVertex2f(-0.75f,0.75f);
glVertex2f(0.75f,0.75f);
glEnd( );

glPolygonMode(GL_FRONT,GL_FILL);
glPolygonMode(GL_BACK,GL_LINE);
//裏の面
glColor3f(0.0f,1.0f,0.0f);
glBegin(GL_QUADS);
glVertex2f(-0.5f,0.5f); glVertex2f(0.5f,0.5f);
glVertex2f(0.5f,-0.5f); glVertex2f(-0.5f,-0.5f);
glEnd( );
//表の面
glColor3f(0.0f,0.0f,1.0f);
glBegin(GL_QUADS);
glVertex2f(-0.3f,0.3f); glVertex2f(-0.3f,-0.3f);
glVertex2f(0.3f,-0.3f); glVertex2f(0.3f,0.3f);
glEnd( );
}

Cソースファイル 終わり


これを .NET2003でそのままビルドすると
error LNK2019: 未解決の外部シンボル・・・・
がでます。



VC++の知識も必要なのですね。当たり前か。
もう少し(かなり)勉強しなければ。
.net 2003の環境がないもので手元で確認できていませんが・・・。

ライブラリファイル(Opengl32.lib)の追加については、下記サイトに詳しいようです。ご参考までに。
http://mail2.nara-edu.ac.jp/~asait/open_gl/compile.htm

ところで、全然的を外れた事を言ってしまっていたら申し訳ないのですが、浮動小数点は使わないほうが良いように思います。
上記ソースファイルだと浮動小数点(float)を使っておられるようですが、制度を求めるのであれば浮動小数点はオススメできないです。

1ナノメートルあたりを単位として内部では整数で扱う方が誤差が少ないかもしれません(いわゆる固定小数点です)。
飲む、呑む・・・さん
ありがとうございます。
ライブラリファイルの追加できました。
VC++のDLLまで出来ました。

ここでまた問題発生。
VBでDllの呼び出しを試みましたが、上手くいきません。

以下 本のサンプル
Option Explicit
Private Declare Sub DrawSpace Lib "c:\dllfile\ProCG3\Debug\ProCG3.dll" (ByVal hDC&)

Private Sub cmdDraw_Click()
Call DrawSpace(picSpace.hDC)
End Sub
サンプル終わり


DLL側の引数は、HDC LONG型
でもVB側のピクチャーボックスのハンドルは、IntPtr型なので、
PictureBox1.Handle.ToInt64 とLONG型にしてみましたが、これも上手くいきません。


固定少数点ですか。
知りませんでした、勉強になります。
まだ先になりますが、是非そのようにしてみようと思います。
出来ました。

Option Explicit
Private Declare Sub DrawSpace Lib "c:\dllfile\ProCG3\Debug\ProCG3.dll" (ByVal hDC as IntPtr)

Private Sub cmdDraw_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDraw.Click
Dim hwnd As New IntPtr
hwnd = picSpace.Handle
Dim g As Graphics = Graphics.FromHwnd(hwnd)
Dim hdc As IntPtr = g.GetHdc()

Call DrawSpace(hdc)

End Sub

インターネットで検索すると、どんぴしゃのサイトがありました。

やっと、OpenGLの勉強が始められます。
いろいろ遊んで、どんなふうに使ったら良いか・・・
今から ワクワクします。

でも、まだまだ分らない事がいっぱい出てくると思います。
また、宜しくお願いします。
>あとむさん

# 別スレより移動しています
>私は、粘土細工のような感じの物が出来ればと思っているのですが、
>足したり、引いたり、伸ばしたり、ねじったり。

それができればいいのですが、、、
技術レベルの話ではなく、マウスでの操作を考えると難しい気がします
何かいいアイディアをお持ちでしょうか
天使猫さん

作図方法としては、座標値入力&マウス操作を考えています。

?空間上に作図平面を指定
?線、円、曲線を作図(3Dの基準となる補助線)
?2を組合せて3D作成
  ドラフト(例 正方形を持ち上げて立方体を作る)
  回転  (茶碗、壺等 焼物のイメージ)
  スイープ (カマボコ、ビニールハウスみたいなの)
  ・・・・・

仕事の時間なので、また後で。
>作図方法としては、座標値入力&マウス操作を考えています。

(実際問題としてそれが現実的ですが)
粘土細工のイメージではないですよね
そちらの方向性でのアイディアはないでしょうか

>?線、円、曲線を作図(3Dの基準となる補助線)
>?2を組合せて3D作成

この2と3の区別とゆうか、、、
補助線と、なんとゆうのだろう? 実出力データ?の区別ってのはどうするものなのでしょうか
続き。

  ? 1〜3で小さなパーツを作り、これらを組合せて完成させる。

  ?、?においては、点、線、円弧(円)、曲線を作図する機能
  ? 立体にする機能
  ? くっ付けたり、ちぎったり、伸ばしたり 演算、変形する機能

このような感じです。


アートを主として考えるなら、手袋に沢山のセンサーを付けて、モニターに表示させた粘土をコネコネするのも面白いかもです。
>アートを主として考えるなら、手袋に沢山のセンサーを付けて、モニターに表示させた粘土をコネコネするのも面白いかもです。

それいいですねぇ
そうゆうデバイスでてないのかなぁ
触ったら圧力のフィードバックがあるといいですね

--

1、2の処理とデータ構造は概ね想像つくのですが
3、4がちょっとイメージできません
どうゆうデータ構造にするんだろう、、、
手袋以外のアイデア。
発泡スチロールにペンキスプレーしたら如何なるか分りますか。
スプレーした部分が溶けるんです。
こんなアート作品を以前に見たことが有ります。

これを応用して、溶かすスプレーと肉盛りするスプレーを使って3D作品を作るって如何です。
スプレーは、マウスで移動、クリックで噴射、右クリックしたままドラッグで噴射口の向きを変える。


データ構造の件
点  XYZの座標値
線  始点と終点
円弧 中心、始点、終点、半径(始点と終点に方向性あり、反時計回りに限定)
(円は、始点と終点が同じになります)
曲線 点の集合体


粘土細工のイメージというのは、3と4の事だったんです。
立体の場合は、各頂点の集合体+作成プロセス・・・・
細かい所までは、決めていません。

以下、参考資料 「立体のデータ構造」でGoogleました。
http://www.ipa.go.jp/NBP/12nendo/12mito/mdata/1-9gh/1-9gh.pdf
http://www.wakayama-u.ac.jp/~tokoi/lecture/cg/cgnote06.pdf
http://www.rsch.tuis.ac.jp/~naka/naka/scola/member/chapter4_html/chap4.html
■インターフェイスの件

溶かすスプレーと肉盛りするスプレー

面白そうですね

でも、思った形にするのは難しそうです
スプレーではなく、なんてゆうか、、、
ドロー系のアプローチをとればよさそうな気がします

■データ構造の件

いろいろみてみましたが、、、
どれも一長一短ですね

目的に応じて使い分けるとゆうのが現実的なところでしょうか

ちなみに、自作3Dエンジンはポリゴンの描画しかサポートしません
内部的にどのようなデータ構造をとっても、擬似なり分割なりでポリゴンで表示します

NC目的なら、境界表現になるのでしょうか
ただこれって切ったりねじったりしたら誤差が問題にならないのかなぁ
点を描画するところまで作ったのですけど
アイコンをどうしようか迷っています
アイコンとか描くの得意な方いらっしゃいませんか
http://angelcat.ugoo.net/mrgsetup.exe

とりあへず公開します
点しか描画できないのでおもしろみもくそもないですけど

これで合ってるのか(3D的に)ちょっと不安です
なんか変だったら指摘してください
天使猫さん

Z+と−側で、遠近法が違うように思うのですが。

?X100、Y100、Z−100
?X100、Y100、Z0
?X100、Y100、Z100


XY平面での2点間距離 
?、?>?、?
遠くのものが小さく表示されているので合ってると思うのですが、、、
右手系で考えていらっしゃいますか
左手系で作ってあります
もしかして、一般的に右手系が普通なのでしょうか
天使猫さん

技術計算(CAD,CAM)では、右手系が主流です。
OpenGLを使っているからですかね?。

Direct3Dを使う、ゲーム等だと左手系になるみたいですね。
どちらを主にするかで使い分けたら良いんじゃないでしょうか。


私は、CADばっかり使っているので、違和感を感じました。
>あとむさん

ご意見ありがとうございます
どうしようかいろいろ考えました
右手系・左手系をオプションで切り替えられるようにしようと思います
内部的には左手系です

うまくいくかよくわかりませんが^^

私の感覚が左手系よりなので、右手系での動作確認などお手伝い頂けると嬉しいです
天使猫さん

私自身、大変勉強になるので経過を見れるのが楽しみです。


情報ネタ
新聞に五十嵐 健夫さんの記事が載ってました。
面白い3Dお絵かきソフトを作っておられます。
http://www-ui.is.s.u-tokyo.ac.jp/~takeo/index-j.html
http://angelcat.ugoo.net/mrgsetup.exe

Mirage Ver.0.02.

右手系/左手系切り替え
線、ラベル、平面描画追加
ビュー、グループリスト

■アイコンについて

グループの選択/非選択のアイコンが思いつきませんでした
(他のアイコンもいいデザインとはいえませんが、、、)

グループのアイコンは上から
・描画/非描画
・表示/非表示
・選択/非選択
・非保護/保護
です

■情報ネタ

研究でこうゆうことができるなんて羨ましいですねぇ

いろいろと参考にしてみます
http://angelcat.ugoo.net/mrgsetup.exe

Mirage Ver.0.03.

・円、円弧描画追加
・曲線描画追加
・テキスト描画追加
・編集機能(移動、回転、分割、接続)追加
・クリップボード機能追加
・各種描画方法追加
・移動方法の設定
・ファイル関連付け
・アンインストーラー完備


とりあへず、作図関連は揃えたつもりです
インターフェイスに関しては、もっといい手法がありそうな気がするけど
他の3Dソフトを使ったことがないのでよくわかりません

そこらへん、バグ報告も含めアドバイスなど頂けると嬉しいかも

さて、次は、作図したものを物体にする機能をつけていくわけですが、、、
内部構造も含めてどうするか未定なので結構時間がかかるかも
天使猫さん

少しずつ出来上がってきていますね。
私の方は、全然進んでいません・・・・。

Mirage Ver.0.03. ダウンロードさせて頂きました。
手探りで、ちょっといじってみただけですが、遠近感に少々違和感を感じます。
ビル、建物や風景なら良いかも知れませんが、手に取れるぐらいの大きさの物なら、消失点が近過ぎるように思います。
調整出来ると良いかもですね。

参考になるでしょうか? 下記のサイトを見つけました。
http://citron.rcedu.kyushu-u.ac.jp/~ayaka/Lec/2007/07L/dguc/Lec02/index.html


あと気になる点。
1.座標値の入力ボックス
  入力後、BS、Delete出来なくなる場合が有ります。
2.操作方法が分ってないだけかもですが、
  XY平面、Z高さ100で中心X0Y0半径100の円を作図すると、
  XY平面上に作図されず、傾いた円が作図される。
3.2と同じ内容ですが、マウス操作のみで円(中心と半径指定)を
  作図する際、作図高さが0以外だと半径を指定する時、作図平面も
  回転します。
4.PCのスペックが低いからでしょうか、作図する時、ラバーバンド
  (赤色の線)の追従が悪いです。



こんなん有れば便利かも
1.入力ボックス、XYZRのキーでカーソル移動
2.マウス操作で、拡大縮小
3.マウス操作で、図をグリグリ回転


今日は、これ位で。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

何でもかんでもやってみよう 更新情報

何でもかんでもやってみようのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。