Memorandum

New version Kouhei's Homepage

OpenTKチュートリアル

つくばチャレンジだけではないかもしれませんが
つくばちゃれんじのような屋外実験では、実験データのリアルタイムでの
見える化は非常に大事です。

ぼくが以前やってたミサイルの発射試験でもペンレコが発射とともに
だーーーーーーてなかんじでデータの見える化をやっておりました。(今はやってないかも)
故に前々からGUIアプリによって走行軌跡を表示したり、LRS(レーザーレンジスキャナ)の
スキャンを可視化したりといったことの重要性をひしひしと感じながら
学生のせいにして、結局毎年間に合わないと言った状況に陥っておりました。

今年は少し気合いを入れるつもりでおります。

ここ最近、GDI+でちまちま行くかと思いましたが、y軸が下向いてるのを自分で修正するライブラリ作ったりするのが面倒になってきて、もともと検討していたOpenGLに戻しました。
OpenGLのラッパークラスとして昨年はTAOFrameworkを試していたのですが、最近本家のWebに接続できないので、OpenTKに乗り換えることにしました。
この記事はOpenTKを使えるようにするまで、付属の英語のマニュアルのチュートリアルを参考にした手順を備忘録がわりに記載したものです。

●OpenTK入手&インストール
http://www.opentk.com/
ここからダウンロードしてインストールしてください。

●VisualStudio2008での使用方法
1 新規作成でWindowsFormアプリケーションのプロジェクトを作ってください。
2 ツール→ツールボックスのアイテム選択
3 出てきたダイアルログからGLControlにチェックを入れる。(フィルタにTKと入れると楽)
4 OKを押してダイアログを閉じます。
5 すべてのWindowsFormにGLControlの歯車のようなアイコンができているので、それをFormにドラッグアンドドロップで配置します。
6 Form1.csを以下のように編集します。(マニュアルには、ここまでにもう少し記述が、あります。かなり省略してます。)プロジェクト名を「OpenTK_test100619」で作成しましたので。namespaceが「OpenTK_test100619」になってますが。皆さんのプロジェクト名で適宜変えてください。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OpenTK.Graphics;          //追加
using OpenTK.Graphics.OpenGL;   //追加


namespace OpenTK_test100619 //名前空間名は適宜変えてください
{
    public partial class Form1 : Form
    {
        bool loaded = false;//追加したメンバー

        public Form1()
        {
            InitializeComponent();
        }

        //以下はOpenGLコントロールを使用できるようにするために追加したコードです

        private void glControl1_Load(object sender, EventArgs e)
        {
            loaded = true;
            glControl1.MakeCurrent(); //GLコントロールを複数使うときはこれでカレントを指定します
            GL.ClearColor(Color.AliceBlue); // Yey! .NET Colors can be used directly!
            SetupViewport();
        }

        private void glControl1_Paint(object sender, PaintEventArgs e)
        {
            if (!loaded) // Play nice
                return;

            glControl1.MakeCurrent(); ////GLコントロールを複数使うときはこれでカレントを指定します
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();
            GL.Color3(Color.Yellow);
            GL.Begin(BeginMode.Triangles);
            GL.Vertex2(10, 20);
            GL.Vertex2(100, 20);
            GL.Vertex2(100, 50);
            GL.End();
            glControl1.SwapBuffers();
        }

        private void SetupViewport()
        {
            int w = glControl1.Width;
            int h = glControl1.Height;
            GL.MatrixMode(MatrixMode.Projection);
            GL.LoadIdentity();
            GL.Ortho(0, 200, 0, 200, -1, 1); // Bottom-left corner pixel has coordinate (0, 0)
            GL.Viewport(0, 0, w, h); // Use all of the glControl painting area
        }
    }
}

7 このままビルドしてもうまくいかないので、GLcontorolをクリックしてプロパティにいって「電撃マーク」をクリックし、paintイベントやLoadイベントにソースコードのイベントハンドラメソッドを結びつけます。(これがわからんで最初悩みました)

8 後はビルドして実行するだけです。OpenGLの文法に沿った描画はこのサンプルでは、paintハンドラに書かれてますが、これを参考に後はOpenGLを勉強しましょう。(私も勉強します。)


9 本家マニュアルにはこのあとアニメーションさせる方法とかチュートリアルが続いています。またやる気になれば続きを書くかもしれません。


以上

Twitter

    follow me on Twitter

    フォロワー