最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

F# 图形数学基础。

IT培训 admin 1浏览 0评论

F# 图形数学基础。

这几天,在看Unity3D,很有意思,其中看到,第一人称控制器,就想看到里面的一些控制脚本是如何实现,才发现,学到的好多数据知识已经还给老师了,还好,走遍大江南北,跟着的书不多,唯一的二本高数没丢.

然后参考网上各个简洁明了的讲洁.

主要有 的从零实现3D图像引擎.

用此文只是用来记录一些向量,矩阵等的操作.没别的实际意义.会与我的学习来更新此文章.

1.求矩阵的逆矩阵。

type XMatrix3 =class val m11:floatval m12:floatval m13:floatval m21:floatval m22:floatval m23:floatval m31:floatval m32:floatval m33:float//new (x11,x12,x21,x22) = XMatrix(this.m11 = x11;this.m12 = x12;this.m13 = 0.0;this.m21 = x21;this.m22 = x22;this.m23 = 0.0;this.m31 = 0.0;this.m32 = 0.0;this.m33 = 1.0)new (x11,x12,x13,x21,x22,x23,x31,x32,x33) = {m11 = x11;m12 = x12;m13 = x13;m21 = x21;m22 = x22;m23 = x23;m31 = x31;m32 = x32;m33 = x33}new (x11,x12,x21,x22) = {m11 = x11;m12 = x12;m13 = 0.0;m21 = x21;m22 = x22;m23 = 0.0;m31 = 0.0;m32 = 0.0;m33 = 1.0}//求行列式                         member r.Det = r.m11*(r.m22*r.m33 - r.m32*r.m23) - r.m12*(r.m21*r.m33 - r.m31*r.m23) + r.m13*(r.m21*r.m32 - r.m31*r.m22)member r.Inverse = let det = r.Detlet det_inv = 1.0/detnew XMatrix3((r.m22*r.m33 - r.m32*r.m23)*det_inv,-(r.m12*r.m33 - r.m32*r.m13)*det_inv,(r.m12*r.m23 - r.m22*r.m13)*det_inv,-(r.m21*r.m33 - r.m31*r.m23)*det_inv,(r.m11*r.m33 - r.m31*r.m13)*det_inv,-(r.m11*r.m23 - r.m21*r.m13)*det_inv,(r.m21*r.m32 - r.m31*r.m22)*det_inv,-(r.m11*r.m32 - r.m31*r.m12)*det_inv,(r.m11*r.m22 - r.m21*r.m12)*det_inv)   endlet a = XMatrix3(1.0,2.0,-1.0,3.0,1.0,0.0,-1.0,0.0,-2.0)
let d = a.Detlet v = XMatrix3(3.0,-4.0,1.0,-2.0)
let s = v.Inverse
let ss = s.m11,s.m12,s.m21,s.m22
View Code

2.求二线段有没交点。交点的位置。这个看从零系列文章的时候,开始没想通怎么到作者是如何来求t1,t2那一步的,然后用F#自己来推导,原来如此。

type XPoint2 = val x:floatval y:floatnew (a,b) = {x = a;y = b}type XVector2 = val x:floatval y:floatnew (a,b) = {x = a;y = b}type XSegment2 =val p0: XPoint2val p1: XPoint2new (ps,pe) = {p0= ps;p1=pe}member m.v with get() = new XVector2(m.p1.x-m.p0.x,m.p1.y - m.p0.y)member m.paramLine//参数化直线with get() = fun(t) -> new XPoint2(m.p0.x + t*m.v.x,m.p0.y+t*m.v.y) static member Intersect (s1:XSegment2,s2:XSegment2) = //let x1 t1 = s1.p0.x + s1.v.x* t1//let y1 t1 = s1.p0.y + s1.v.y* t1//let x2 t2 = s2.p0.x + s2.v.x* t2//let y2 t2 = s2.p0.y + s2.v.y* t2//s1.paramLine(t1).x - s2.paramLine(t1).x //s1.paramLine(t1).y = s2.paramLine(t1).y//交点//let x_ = fun(t1,t2) -> s1.v.x* t1 - s2.v.x* t2 + s1.p0.x - s2.p0.x = 0//let y_ = fun(t1,t2) -> s1.v.y* t1 - s2.v.y* t2 + s2.p0.y - s2.p0.y = 0//用矩阵来求方阵式let xy = new XMatrix3(s1.v.x,-s2.v.x,s1.v.y,-s2.v.y)let xyI = xy.Inverselet a = s2.p0.x - s1.p0.xlet b = s2.p0.y - s1.p0.ylet t1 = xyI.m11 * a + xyI.m12 * blet t2 = xyI.m21 * a + xyI.m22 * bt1,t2,s1.paramLine(t1),s2.paramLine(t2)let x1 = XSegment2(XPoint2(4.0,4.0),XPoint2(2.0,6.0))
let x2 = XSegment2(XPoint2(4.0,2.0),XPoint2(6.0,4.0))let q,w,e,r = XSegment2.Intersect(x1,x2)
let show = e.x,e.y,r.x,r.y
View Code

val x1 : XMath.XSegment2
val x2 : XMath.XSegment2
val w : float = 0.5
val r : XMath.XPoint2
val q : float = -0.5
val e : XMath.XPoint2
val it : float * float * float * float = (5.0, 3.0, 5.0, 3.0)

3.向量点乘(内积)r = (a,b,c)*(x,y,z)=ax+by+cz,是一个标量,不具有方向了。有如下关系,cos@=r/(|a,b,c|*|x,y,z|).而cos@=一边的投影长度/另一边。所以用来求二个向量之间投影向量与对应的法向量。

向量叉乘(叉积)r=(a,b,c)*(x,y,z)=(bz-yc,-az+xc,ay-bx).是一个向量,有如下关系,sin@=|r|/(|a,b,c|*|x,y,z|).其中r与向量(a,b,c),(x,y,z)互相垂直。

二个向量的叉积结合相应坐标系来看,就是各项的代数余子式。

4.OpenGL里的摄像机与透视矩阵.

用F#实现OpenTK上的一个小例子。相关代码是画一个立方体,然后不断旋转。

用的OpenGL,对应的是列向量,右手坐标系。

相关个人理解,不论是OpenGL或是D3D,人站在地面上,在3维里,XZ面是表示地面,Z用来表示远近(人眼看的远近),Y用来表示高度。我们眼中看到的平面应该平行于XY面。人相当于是地面(XZ面)的法向量。

而透视投影用在实际当中来说,人眼选择一个近处1米到远处10米的所有物体,在这当中所有物体会影视到我们眼球表面。透视投影相当于就是计算视线内所有物体到眼球表面上的位置。

 1 #r "D:\Program Files\openTK\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
 2 open System
 3 open System.Collections.Generic
 4 open System.Windows.Forms
 5 open System.Drawing
 6 
 7 open OpenTK
 8 open OpenTK.Graphics
 9 open OpenTK.Graphics.OpenGL
10 
11 type ImmediateWindow() =
12     inherit GameWindow(800,600,new GraphicsMode(new ColorFormat(16),16))
13     do base.VSync <- VSyncMode.On
14     let rotation_speed = 180.0f
15     let mutable angle = 0.0f
16     override v.OnLoad e =
17         base.OnLoad(e)
18         GL.ClearColor(Color.MidnightBlue)
19         GL.Enable(EnableCap.DepthTest)
20     override v.OnResize e =
21         base.OnResize e
22         GL.Viewport(0,0,v.Width,v.Height)
23         let ratio = float32 v.Width/float32 v.Height
24         let mutable pective = Matrix4.CreatePerspectiveFieldOfView(float32 MathHelper.PiOver4,ratio,1.0f,64.0f)
25         GL.MatrixMode(MatrixMode.Projection)
26         GL.LoadMatrix(&pective)
27 
28     member v.DrawCube() =
29         GL.Begin(BeginMode.Quads);
30 
31         GL.Color3(Color.Silver);
32         GL.Vertex3(-1.0f, -1.0f, -1.0f);
33         GL.Vertex3(-1.0f, 1.0f, -1.0f);
34         GL.Vertex3(1.0f, 1.0f, -1.0f);
35         GL.Vertex3(1.0f, -1.0f, -1.0f);
36 
37         GL.Color3(Color.Honeydew);
38         GL.Vertex3(-1.0f, -1.0f, -1.0f);
39         GL.Vertex3(1.0f, -1.0f, -1.0f);
40         GL.Vertex3(1.0f, -1.0f, 1.0f);
41         GL.Vertex3(-1.0f, -1.0f, 1.0f);
42 
43         GL.Color3(Color.Moccasin);
44 
45         GL.Vertex3(-1.0f, -1.0f, -1.0f);
46         GL.Vertex3(-1.0f, -1.0f, 1.0f);
47         GL.Vertex3(-1.0f, 1.0f, 1.0f);
48         GL.Vertex3(-1.0f, 1.0f, -1.0f);
49 
50         GL.Color3(Color.IndianRed);
51         GL.Vertex3(-1.0f, -1.0f, 1.0f);
52         GL.Vertex3(1.0f, -1.0f, 1.0f);
53         GL.Vertex3(1.0f, 1.0f, 1.0f);
54         GL.Vertex3(-1.0f, 1.0f, 1.0f);
55 
56         GL.Color3(Color.PaleVioletRed);
57         GL.Vertex3(-1.0f, 1.0f, -1.0f);
58         GL.Vertex3(-1.0f, 1.0f, 1.0f);
59         GL.Vertex3(1.0f, 1.0f, 1.0f);
60         GL.Vertex3(1.0f, 1.0f, -1.0f);
61 
62         GL.Color3(Color.ForestGreen);
63         GL.Vertex3(1.0f, -1.0f, -1.0f);
64         GL.Vertex3(1.0f, 1.0f, -1.0f);
65         GL.Vertex3(1.0f, 1.0f, 1.0f);
66         GL.Vertex3(1.0f, -1.0f, 1.0f);
67         GL.End();
68     override v.OnUpdateFrame e =
69         base.OnUpdateFrame e
70         if v.Keyboard.[OpenTK.Input.Key.Escape]
71         then 
72             v.Exit()   
73     override v.OnRenderFrame(e) =
74         base.OnRenderFrame e
75         GL.Clear (ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit)
76         let mutable eye = new Vector3(float32 0.0,float32 5.0,float32 5.0)
77         let mutable target = new Vector3(float32 0.0,float32 0.0,float32 0.0)
78         let mutable up = new Vector3(float32 0.0,float32 1.0,float32 0.0)
79         let mutable lookat = Matrix4.LookAt(0.f, 5.f, 5.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f);
80         GL.MatrixMode(MatrixMode.Modelview)
81         GL.LoadMatrix(&lookat)
82         angle <- angle + rotation_speed *(float32 e.Time)
83         GL.Rotate(angle,0.0f,1.0f,0.0f)
84         v.DrawCube()
85         v.SwapBuffers()
86 
87 let example = new ImmediateWindow()
88 do example.Run(30.)        
View Code

5.OpenGL里的矩阵变换.顺序,当前矩阵,主要变换.

 1 #r "D:\Program Files\openTK\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
 2 open System
 3 open System.Collections.Generic
 4 open System.Windows.Forms
 5 open System.Drawing
 6 
 7 open OpenTK
 8 open OpenTK.Graphics
 9 open OpenTK.Graphics.OpenGL
10 
11 type ImmediateWindow() =
12     inherit GameWindow(800,600,new GraphicsMode(new ColorFormat(16),16))
13     let num_lists = 13
14     let lists = Array.create num_lists 0//[|num_lists|]
15     override v.OnLoad e =
16         base.OnLoad(e)
17         GL.ClearColor(Color.MidnightBlue)
18         GL.Enable(EnableCap.DepthTest)
19         GL.MatrixMode(MatrixMode.Modelview)
20         GL.LoadIdentity()
21         let first_list = GL.GenLists(num_lists)
22         let mutable c = 0.
23         for i = 0 to num_lists-1 do
24             lists.[i] <- first_list + i
25             GL.NewList(first_list + i,ListMode.Compile)
26             GL.Color3(0.3+0.7*c*c,0.3+1.4*c*c,0.7-0.7*c*c)
27             c <- c+1./float num_lists
28             GL.PushMatrix()
29             GL.Rotate(c*360.,0.,0.,1.0)
30             GL.Translate(5.,0.,0.)
31             GL.Begin(BeginMode.Quads)
32             GL.Vertex3(-1.,-1.,1.)
33             GL.Vertex3(1.,-1.,1.)
34             GL.Vertex3(1.,1.,1.)
35             GL.Vertex3(-1.,1.,1.)
36             GL.End()
37             GL.PopMatrix()
38             GL.EndList()
39     override v.OnUnload e =
40         GL.DeleteLists(lists.[0],num_lists)
41     override v.OnResize e =
42         GL.Viewport(0,0,v.Width,v.Height)
43         let ratio = float32 v.Width/float32 v.Height
44         let mutable pective = Matrix4.CreatePerspectiveFieldOfView(float32 MathHelper.PiOver4,ratio,1.0f,64.0f)
45         GL.MatrixMode(MatrixMode.Projection)
46         GL.LoadMatrix(&pective)   
47     override v.OnUpdateFrame e =
48         base.OnUpdateFrame e
49         if v.Keyboard.[OpenTK.Input.Key.Escape]
50         then 
51             v.Exit()   
52     override v.OnRenderFrame(e) =
53        // base.OnRenderFrame e
54         //GL.Clear (ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit)
55         let mutable lookat = Matrix4.LookAt(0.f, 0.f, 16.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f);
56         GL.MatrixMode(MatrixMode.Modelview)
57         GL.LoadMatrix(&lookat)
58         GL.Clear(ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit);
59         GL.CallLists(num_lists, ListNameType.Int, lists);
60         v.SwapBuffers()
61 
62 let example = new ImmediateWindow()
63 do example.Run(30.)   
View Code

6.OpenGL里的缓冲区.

  1 #r "F:\3D\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
  2 
  3 open System
  4 open System.Collections.Generic
  5 open System.Windows.Forms
  6 open System.Threading
  7 open System.Drawing
  8 
  9 open OpenTK
 10 open OpenTK.Graphics
 11 open OpenTK.Graphics.OpenGL
 12 
 13 type VBO =
 14     struct  
 15         val mutable VboID : int 
 16         val mutable EboID : int  
 17         val mutable NumElements : int  
 18     end
 19 
 20 type VertexPositionColor =
 21     struct 
 22         val mutable Position : Vector3
 23         val mutable Color : uint32
 24         new(x,y,z,color:Color) = {Position = new Vector3(x,y,z);Color=VertexPositionColor.ToRgba(color)}
 25         static member ToRgba (color:Color) =
 26             uint32 color.A <<< 24 ||| uint32 color.B <<< 16 ||| uint32 color.G <<< 8 |||uint32 color.R           
 27     end
 28 
 29 type VBOWindow() =
 30     inherit GameWindow(400,300)
 31     let speed = 180.
 32     let mutable angle = 0.
 33     let CubeVertices = [| 
 34         new VertexPositionColor(-1.0f, -1.0f,  1.0f, Color.DarkRed);//0
 35         new VertexPositionColor( 1.0f, -1.0f,  1.0f, Color.DarkRed);//1
 36         new VertexPositionColor( 1.0f,  1.0f,  1.0f, Color.Gold);//2
 37         new VertexPositionColor(-1.0f,  1.0f,  1.0f, Color.Gold);//3
 38         new VertexPositionColor(-1.0f, -1.0f, -1.0f, Color.DarkRed);//4
 39         new VertexPositionColor( 1.0f, -1.0f, -1.0f, Color.DarkRed);//5
 40         new VertexPositionColor( 1.0f,  1.0f, -1.0f, Color.Gold);//6
 41         new VertexPositionColor(-1.0f,  1.0f, -1.0f, Color.Gold) |]//7
 42     let CubeElements  = [| 
 43             0s; 1s; 2s; 2s; 3s; 0s; // front face
 44             3s; 2s; 6s; 6s; 7s; 3s; // top face
 45             7s; 6s; 5s; 5s; 4s; 7s; // back face
 46             4s; 0s; 3s; 3s; 7s; 4s; // left face
 47             0s; 1s; 5s; 5s; 4s; 0s; // bottom face
 48             1s; 5s; 6s; 6s; 2s; 1s // right face 
 49             |]
 50     let mutable vbo = new VBO()
 51     override v.OnLoad e =
 52         base.OnLoad e
 53         let version = GL.GetString(StringName.Version)
 54         let major = int version.[0]
 55         let minor =int version.[2]
 56         if major <= 1 && minor < 5 then 
 57             v.Exit()
 58         GL.ClearColor(System.Drawing.Color.MidnightBlue)
 59         GL.Enable(EnableCap.DepthTest)
 60 
 61         GL.GenBuffers(1,&vbo.VboID)
 62         GL.BindBuffer(BufferTarget.ArrayBuffer,vbo.VboID)
 63         let mutable size = CubeVertices.Length * BlittableValueType.StrideOf(CubeVertices.[0]);
 64         GL.BufferData(BufferTarget.ArrayBuffer,new IntPtr(size),CubeVertices,BufferUsageHint.StaticDraw)
 65 
 66         GL.GenBuffers(1,&vbo.EboID)
 67         GL.BindBuffer(BufferTarget.ElementArrayBuffer,vbo.EboID)
 68         let mutable elementSize = CubeElements.Length * sizeof<int16>
 69         GL.BufferData(BufferTarget.ElementArrayBuffer,new IntPtr(elementSize),CubeElements,BufferUsageHint.StaticDraw)
 70 
 71         vbo.NumElements <- CubeElements.Length
 72     override v.OnResize e =
 73         base.OnResize e
 74         GL.Viewport(0,0,v.Width,v.Height)
 75         let aspect = float32 v.Width / float32 v.Height 
 76         let mutable projection = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4,aspect,1.f,64.f)
 77         GL.MatrixMode(MatrixMode.Projection)
 78         GL.LoadMatrix(&projection)
 79     override v.OnRenderFrame e =
 80         base.OnRenderFrame e
 81         GL.Clear(ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit)
 82         let mutable lookat = Matrix4.LookAt(new Vector3(0.f,5.f,5.f),Vector3.Zero,Vector3.UnitY)
 83         GL.MatrixMode(MatrixMode.Modelview)
 84         GL.LoadMatrix(&lookat)
 85 //        angle <- angle + speed * float e.Time
 86 //        GL.Rotate(angle,0.,1.,0.)
 87 //
 88 //        GL.EnableClientState ArrayCap.ColorArray
 89 //        GL.EnableClientState ArrayCap.VertexArray
 90 //        GL.BindBuffer(BufferTarget.ArrayBuffer,vbo.VboID)
 91 //        GL.BindBuffer(BufferTarget.ElementArrayBuffer,vbo.EboID)
 92 //        let size = BlittableValueType.StrideOf(CubeVertices.[0])
 93 //        GL.VertexPointer(3,VertexPointerType.Float,size,new IntPtr(0))
 94 //        GL.ColorPointer(4,ColorPointerType.UnsignedByte,size,new IntPtr(12))
 95 //        GL.DrawElements(BeginMode.Triangles,vbo.NumElements,DrawElementsType.UnsignedShort,IntPtr.Zero)
 96 
 97         GL.Begin(BeginMode.Triangles)
 98         GL.Color3(Color.Red)
 99         GL.Vertex3(-1.0f, -1.0f,  1.0f);//0
100         GL.Vertex3( 1.0f, -1.0f,  1.0f);//1
101         GL.Vertex3( 1.0f,  1.0f,  1.0f);//2        
102         GL.Vertex3( 1.0f,  1.0f,  1.0f);//2
103         GL.Vertex3( -1.0f,  1.0f,  1.0f);//3
104         GL.Vertex3(-1.0f, -1.0f,  1.0f);//0
105         GL.Color3(Color.Black)
106         GL.End()
107         v.SwapBuffers()
108 
109         
110 let vboWindow = new VBOWindow()
111 do vboWindow.Run()
View Code

 7.如何更新OpenGL里的缓冲区.

  1 #r "F:\3D\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
  2 open System
  3 open System.Collections.Generic
  4 open System.Windows.Forms
  5 open System.Threading
  6 open System.Drawing
  7 open OpenTK
  8 open OpenTK.Graphics
  9 open OpenTK.Graphics.OpenGL
 10 
 11 type VertexColor =
 12     struct
 13         val mutable R : byte
 14         val mutable G : byte
 15         val mutable B : byte
 16         val mutable A : byte
 17         val mutable Position : Vector3
 18         static member Size = 16 
 19     end
 20 
 21 type Location =
 22     struct
 23         val mutable Direction : Vector3
 24         val mutable Age : uint32
 25     end
 26 
 27 type DynamicWindow() =
 28     inherit GameWindow(400,300)
 29     static let mutable MaxCount = 20
 30     let mutable visibleCount = 0
 31     let VBO = Array.create MaxCount (new VertexColor())
 32     let Locations = Array.create MaxCount (new Location())
 33     let mutable handle = 0;
 34 
 35     override v.OnLoad e =
 36         GL.ClearColor(0.1f,0.f,0.1f,0.f)
 37         GL.Enable EnableCap.DepthTest
 38 
 39         GL.PointSize 5.f
 40         GL.Enable EnableCap.PointSmooth
 41         GL.Hint(HintTarget.PointSmoothHint,HintMode.Nicest)
 42         GL.EnableClientState ArrayCap.ColorArray
 43         GL.EnableClientState ArrayCap.VertexArray
 44 
 45         GL.GenBuffers(1,&handle)
 46         GL.BindBuffer(BufferTarget.ArrayBuffer,handle)
 47         GL.ColorPointer(4,ColorPointerType.UnsignedByte,VertexColor.Size,0)
 48         GL.VertexPointer(3,VertexPointerType.Float,VertexColor.Size,4)
 49 
 50         let rnd = new Random()
 51         let temp = Vector3.Zero
 52         let getRndByte() =
 53             let rnd = rnd.Next(0,255)
 54             byte rnd
 55         let getRndDir() =
 56             let rnd = (rnd.NextDouble()-0.5)*0.5
 57             float32 rnd
 58         for i = 0 to MaxCount - 1 do
 59             VBO.[i].R <- getRndByte()
 60             VBO.[i].G <- getRndByte()
 61             VBO.[i].B <- getRndByte()
 62             VBO.[i].A <- getRndByte()
 63             VBO.[i].Position <- Vector3.Zero
 64 
 65             Locations.[i].Direction <- new Vector3(getRndDir(),getRndDir(),getRndDir())
 66             Locations.[i].Age <- uint32 0
 67         visibleCount <- 0
 68     override v.OnResize e =
 69         GL.Viewport(0,0,v.Width,v.Height)    
 70         GL.MatrixMode MatrixMode.Projection
 71         let mutable pro = Matrix4.CreatePerspectiveFieldOfView(float32 MathHelper.PiOver4,float32 v.Width/ float32 v.Height,1.0f,50.f)
 72         GL.LoadMatrix(&pro)
 73         GL.MatrixMode MatrixMode.Modelview
 74         let mutable view = Matrix4.LookAt(Vector3.UnitZ,Vector3.Zero,Vector3.UnitY)
 75         GL.LoadMatrix(&view)
 76     override v.OnUpdateFrame e =
 77         if visibleCount < MaxCount then
 78             visibleCount <- visibleCount + 1
 79         let mutable temp = Vector3.Zero
 80         for i = MaxCount - visibleCount to MaxCount - 1 do
 81             if Locations.[i].Age >= uint32 MaxCount then
 82                 Locations.[i].Age <- uint32 0
 83                 VBO.[i].Position <- Vector3.Zero
 84             else
 85                 let max =Math.Max(Locations.[i].Direction.LengthFast * 10.f,1.f)
 86                 Locations.[i].Age <- uint32 max
 87                 Vector3.Multiply(&Locations.[i].Direction,float32 e.Time,&temp)
 88                 Vector3.Add(&VBO.[i].Position,&temp,&VBO.[i].Position)
 89     
 90     override v.OnRenderFrame e =
 91         v.Title <- visibleCount.ToString() + " Points."       
 92         (ClearBufferMask.ColorBufferBit |||ClearBufferMask.DepthBufferBit) |> GL.Clear
 93         GL.PushMatrix()
 94         GL.Translate(0.f,0.f,-5.f)
 95         GL.BufferData(BufferTarget.ArrayBuffer,IntPtr (VertexColor.Size * MaxCount),IntPtr.Zero,BufferUsageHint.StaticDraw)
 96         GL.BufferData(BufferTarget.ArrayBuffer,IntPtr (VertexColor.Size * MaxCount),VBO,BufferUsageHint.StaticDraw)
 97         GL.DrawArrays(BeginMode.Points,MaxCount - visibleCount,visibleCount)
 98         GL.PopMatrix()
 99         v.SwapBuffers()
100 
101 let w = new DynamicWindow()
102 do w.Run()
103  
View Code

 8.OpenGL纹理简单应用.

 1 #r "F:\3D\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
 2 open System
 3 open System.Collections.Generic
 4 open System.Windows.Forms
 5 open System.Threading
 6 open System.Drawing
 7 open System.Drawing.Imaging
 8 open OpenTK
 9 open OpenTK.Graphics
10 open OpenTK.Graphics.OpenGL
11 
12 type Textures() = 
13     inherit GameWindow(400,300)
14     let mutable texture = 0
15     let bitmap = new Bitmap(@"F:\3D\1.0\ConsoleApplication1\logo.jpg")
16     override v.OnLoad e =
17         GL.ClearColor Color.MidnightBlue
18         GL.Enable EnableCap.Texture2D
19         GL.Hint(HintTarget.PerspectiveCorrectionHint,HintMode.Nicest)
20 
21         GL.GenTextures(1,&texture)
22         GL.BindTexture(TextureTarget.Texture2D,texture)
23         let data = bitmap.LockBits(new System.Drawing.Rectangle(0,0,bitmap.Width,bitmap.Height),ImageLockMode.ReadOnly,System.Drawing.Imaging.PixelFormat.Format32bppArgb)
24         GL.TexImage2D(TextureTarget.Texture2D,0,PixelInternalFormat.Rgba, data.Width, data.Height, 0,
25             OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0)
26         bitmap.UnlockBits(data)
27         GL.TexParameter(TextureTarget.Texture2D,TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear)
28         GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear)
29     override v.OnResize e =
30         GL.Viewport(0,0,v.Width,v.Height)
31         GL.MatrixMode(MatrixMode.Projection)
32         GL.LoadIdentity()
33         GL.Ortho(-1.,1.,-1.,1.,0.,4.)
34     override v.OnRenderFrame e =
35         GL.Clear ClearBufferMask.ColorBufferBit
36         GL.MatrixMode(MatrixMode.Modelview)
37         GL.LoadIdentity()
38         GL.BindTexture(TextureTarget.Texture2D,texture)
39         GL.Color3(Color.White)
40         GL.Begin(BeginMode.Quads);
41         GL.TexCoord2(0.0f, 1.0f);
42         GL.Vertex2(-0.6f, -0.4f);
43         GL.TexCoord2(1.0f, 1.0f); 
44         GL.Vertex2(0.6f, -0.4f);
45         GL.TexCoord2(1.0f, 0.0f); 
46         GL.Vertex2(0.6f, 0.4f);
47         GL.TexCoord2(0.0f, 0.0f); 
48         GL.Vertex2(-0.6f, 0.4f);
49         GL.End();
50         v.SwapBuffers()
51 
52 let t = new Textures()
53 do t.Run()
View Code

 9.启用OpenTK里的GLControl.

  1 #r "F:\3D\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
  2 #r "F:\3D\1.0\Binaries\OpenTK\Debug\OpenTK.GLControl.dll"
  3 
  4 open System
  5 open System.Collections.Generic
  6 open System.Windows.Forms
  7 open System.Threading
  8 open System.Drawing
  9 open System.Drawing.Imaging
 10 open OpenTK
 11 open OpenTK.Graphics
 12 open OpenTK.Graphics.OpenGL
 13 
 14 type loopForm() as form=
 15     inherit Form()
 16     let mutable x = 5.f
 17     let mutable y = 5.f
 18     let mutable z = 10.f
 19     let offest = 1.f
 20     let glControl = new OpenTK.GLControl()
 21     let textX= new TextBox()
 22     let textY= new TextBox()
 23     let textZ= new TextBox()
 24     let textLR = new TextBox()
 25     let textUD= new TextBox()
 26     let labelX= new Label()
 27     let labelY= new Label()
 28     let labelZ= new Label()
 29     let labelLR = new Label()
 30     let labelUD= new Label()
 31     let aArray = [| 
 32                             1.f;1.f;1.f
 33                             -1.f;1.f;1.f
 34                             -1.f;-1.f;1.f
 35                             1.f;-1.f;1.f
 36                             1.f;1.f;-1.f
 37                             1.f;1.f;1.f
 38                             1.f;-1.f;1.f
 39                             1.f;-1.f;-1.f
 40                             1.f;1.f;-1.f
 41                             -1.f;1.f;-1.f
 42                             -1.f;1.f;1.f
 43                             1.f;1.f;1.f
 44                             -1.f;1.f;-1.f
 45                             1.f;1.f;-1.f
 46                             1.f;-1.f;-1.f
 47                             -1.f;-1.f;-1.f
 48                         |]
 49     let vArray = [| 
 50                             1.f;1.f;1.f
 51                             -1.f;1.f;1.f
 52                             -1.f;-1.f;1.f
 53                             1.f;-1.f;1.f
 54                             1.f;1.f;-1.f
 55                             1.f;-1.f;-1.f      
 56                             -1.f;1.f;-1.f
 57                             -1.f;-1.f;-1.f                     
 58                         |]
 59     let iArray = [|
 60                             0u;1u;2u;3u;
 61                             4u;0u;3u;5u;
 62                             4u;6u;1u;0u;
 63                             6u;4u;5u;7u;
 64                       |]
 65 
 66     let cArray = [| 
 67                             1.f;1.f;1.f
 68                             1.f;0.f;0.f
 69                             0.f;1.f;0.f
 70                             0.f;0.f;1.f
 71                             1.f;1.f;0.f
 72                             0.f;1.f;1.f
 73                             1.f;0.f;1.f
 74                             0.f;0.f;0.f
 75                         |]
 76     do
 77         form.SuspendLayout()
 78         glControl.Location <- new Point(10,40)
 79         glControl.Size <- new Size(400,300)
 80         glControl.BackColor <- Color.Red
 81         glControl.Resize.Add(form.resize)
 82         glControl.Paint.Add(form.paint)
 83         form.MouseWheel.Add(form.MouseDown)
 84         glControl.Text <- "xxxxxx"
 85         form.ClientSize <- new Size(600,400)
 86         form.Text <- "opengl"
 87         form.StartPosition <- FormStartPosition.Manual
 88         form.Location <- new Point(1200,600)
 89         form.Controls.Add(glControl)
 90         form.ResumeLayout(false)
 91         labelX.Location <- new Point(420,40)
 92         labelY.Location <- new Point(420,70)
 93         labelZ.Location <- new Point(420,100)
 94         labelLR.Location <- new Point(420,130)
 95         labelUD.Location <- new Point(420,160)
 96         labelX.Text <- "X:"
 97         labelY.Text <- "Y:"
 98         labelZ.Text <- "Z:"
 99         labelLR.Text  <- "水平:"
100         labelUD.Text <-"上下:"
101         textX.Location <- new Point(460,40)
102         textY.Location <- new Point(460,70)
103         textZ.Location <- new Point(460,100)
104         textLR.Location <- new Point(460,130)
105         textUD.Location <- new Point(460,160)
106         form.Controls.Add(textX)
107         form.Controls.Add(textY)
108         form.Controls.Add(textZ)
109         form.Controls.Add(textLR)
110         form.Controls.Add(textUD)
111         form.Controls.Add(labelX)
112         form.Controls.Add(labelY)
113         form.Controls.Add(labelZ)
114         form.Controls.Add(labelLR)
115         form.Controls.Add(labelUD)
116     override v.OnLoad e =
117         base.OnLoad e
118         GL.ClearColor Color.MidnightBlue
119         Application.Idle.Add(v.AIdle)
120         v.ShowUI        
121         textX.TextChanged.Add(form.TextChange)
122         textY.TextChanged.Add(form.TextChange)
123         textZ.TextChanged.Add(form.TextChange)
124         textLR.TextChanged.Add(form.TextChange)
125         textUD.TextChanged.Add(form.TextChange)
126         //踢除正反面
127         //GL.Enable EnableCap.CullFace
128         //GL.CullFace CullFaceMode.Back
129         //指定正反面
130         GL.FrontFace FrontFaceDirection.Ccw
131         //设置材料面填充模式
132         GL.PolygonMode(MaterialFace.Front,PolygonMode.Fill)
133         GL.PolygonMode(MaterialFace.Back,PolygonMode.Line)
134         //启用数组功能.
135         GL.EnableClientState(ArrayCap.VertexArray)
136         GL.EnableClientState(ArrayCap.ColorArray)
137     member v.resize (e:EventArgs) =
138         GL.Viewport(0,0,glControl.ClientSize.Width,glControl.ClientSize.Height)
139         let aspect = float32 glControl.ClientSize.Width /float32 glControl.ClientSize.Height
140         let mutable projection = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4,aspect,0.1f,64.f)
141         GL.MatrixMode MatrixMode.Projection
142         GL.LoadMatrix(&projection)
143     member v.paint (e:PaintEventArgs) =
144         v.Render()
145     member v.AIdle (e:EventArgs) =
146         while (glControl.IsIdle) do
147             v.Render()
148     member v.TextChange (e:EventArgs) =
149         x <- v.UIValue(textX)
150         y <- v.UIValue(textY)
151         z <- v.UIValue(textZ)
152     member v.MouseDown(e:MouseEventArgs) =
153         match v.ActiveControl with
154         | :? TextBox as t1 -> 
155             let mutable t = v.UIValue(t1)
156             t <- t + float32 e.Delta * offest * 0.01f
157             t1.Text <- t.ToString()
158         | _ -> 
159             v.Text <- v.ActiveControl.Text
160             let state =float32 e.Delta * offest * 0.01f
161             z <- z + state
162         v.ShowUI
163     member x.UIValue
164         with get (text:TextBox) = 
165             let mutable value = 0.f
166             if System.Single.TryParse(text.Text,&value) then
167                 value <- value
168             value
169         and set (text:TextBox) (value:float32) = text.Text<- value.ToString()
170     member v.ShowUI =
171         textX.Text <- x.ToString()
172         textY.Text <- y.ToString()
173         textZ.Text <- z.ToString()
174         textLR.Text <- v.UIValue(textLR).ToString()
175         textUD.Text <- v.UIValue(textUD).ToString()
176        //lControl.Focus() |> ignore        
177     member v.Render =
178        // v.ShowUI        
179         let mutable lookat = Matrix4.LookAt(new Vector3(x,y,z),Vector3.Zero,Vector3.UnitY)
180         GL.MatrixMode(MatrixMode.Modelview)
181         GL.LoadMatrix(&lookat)
182         GL.Translate(1.f,1.f,1.f)
183         GL.Rotate(v.UIValue(textLR),0.f,1.f,0.f)
184         GL.Rotate(v.UIValue(textUD),1.f,0.f,0.f)
185         GL.Clear(ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit)
186         GL.Color3(1.f,1.f,0.f)
187         GL.PointSize(10.f)
188         GL.Begin BeginMode.Points
189         GL.Vertex3(x-1.f,y-1.f,0.f)
190         GL.Vertex3(0.f,2.f,0.f)
191         GL.End()
192         GL.Begin BeginMode.Lines
193         GL.Vertex3(x,y,-200.f)
194         GL.Vertex3(x,y,200.f)
195         GL.End()
196         GL.Color3(Color.Black)
197         //GL.DrawArrays(BeginMode.Quads,0,cArray.Length)
198 //        GL.Begin BeginMode.Quads
199 //        GL.ArrayElement(0)
200 //        GL.ArrayElement(1)
201 //        GL.ArrayElement(2)
202 //        GL.ArrayElement(3)
203 //        GL.End()      
204         GL.VertexPointer(3,VertexPointerType.Float,0,aArray)  
205         GL.ColorPointer(3,ColorPointerType.Float,0,cArray) 
206         GL.IndexPointer(IndexPointerType.Int,0,iArray)
207         //GL.DrawElements(BeginMode.Quads,4, DrawElementsType.UnsignedInt, [|0u;1u;2u;3u|])
208         //GL.DrawElements(BeginMode.Quads,4, DrawElementsType.UnsignedInt, [|4u;5u;6u;7u|])
209         GL.DrawElements(BeginMode.Quads,iArray.Length,DrawElementsType.UnsignedInt,iArray)
210         GL.Begin BeginMode.Lines
211         GL.Color3(Color.Black)
212         GL.Vertex3(Vector3.Zero)
213         GL.Vertex3(Vector3.UnitX * 1000.f)
214         GL.Color3(Color.White)
215         GL.Vertex3(Vector3.Zero)
216         GL.Vertex3(Vector3.UnitY * 1000.f)
217         GL.Color3(Color.Red)
218         GL.Vertex3(Vector3.Zero)
219         GL.Vertex3(Vector3.UnitZ * 1000.f)
220         GL.End()
221         glControl.SwapBuffers()
222         ignore
223 let t = new loopForm()
224 t.Show()   
225 
226 //        GL.Begin BeginMode.Quads
227 //        GL.Color3(Color.Black)
228 //        GL.Vertex3(1.f,1.f,1.f)
229 //        GL.Vertex3(-1.f,1.f,1.f)
230 //        GL.Vertex3(-1.f,-1.f,1.f)
231 //        GL.Vertex3(1.f,-1.f,1.f)
232 //
233 //        GL.Color3(Color.White)
234 //        GL.Vertex3(1.f,1.f,-1.f)
235 //        GL.Vertex3(1.f,1.f,1.f)
236 //        GL.Vertex3(1.f,-1.f,1.f)
237 //        GL.Vertex3(1.f,-1.f,-1.f)
238 //
239 //        GL.Color3(Color.Red)
240 //        GL.Vertex3(1.f,1.f,-1.f)
241 //        GL.Vertex3(-1.f,1.f,-1.f)
242 //        GL.Vertex3(-1.f,1.f,1.f)
243 //        GL.Vertex3(1.f,1.f,1.f)
244 //
245 //        GL.Color3(0.f,1.f,0.f)
246 //        GL.Vertex3(-1.f,1.f,-1.f)
247 //        GL.Vertex3(1.f,1.f,-1.f)
248 //        GL.Vertex3(1.f,-1.f,-1.f)
249 //        GL.Vertex3(-1.f,-1.f,-1.f)
250 //        GL.End()  
View Code

 9.OpenTK里的光照.

  1 #r "D:\Program Files\openTK\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
  2 #r "D:\Program Files\openTK\1.0\Binaries\OpenTK\Debug\OpenTK.Compatibility.dll"
  3 #r "D:\Program Files\openTK\1.0\Binaries\OpenTK\Debug\OpenTK.GLControl.dll"
  4 
  5 open System
  6 open System.Collections.Generic
  7 open System.Windows.Forms
  8 open System.Threading
  9 open System.Drawing
 10 open System.Drawing.Imaging
 11 open OpenTK
 12 open OpenTK.Graphics
 13 open OpenTK.Graphics.OpenGL
 14 
 15 type loopForm() as form=
 16     inherit Form()
 17     let mutable x = 10.f
 18     let mutable y = 10.f
 19     let mutable z = 10.f
 20     let offest = 1.f
 21     let glControl = new OpenTK.GLControl()
 22     let textX= new TextBox()
 23     let textY= new TextBox()
 24     let textZ= new TextBox()
 25     let textLR = new TextBox()
 26     let textUD= new TextBox()
 27     let textInfo = new TextBox()
 28     let labelX= new Label()
 29     let labelY= new Label()
 30     let labelZ= new Label()
 31     let labelLR = new Label()
 32     let labelUD= new Label()
 33     let mutable first = 0
 34     let mutable buffer = 0
 35     let list = 0
 36     let scale = 3.f
 37     let mutable r = 0.f
 38     let q = Glu.NewQuadric()
 39     let mutable ll = [|7.f;7.f;0.f;1.f|]
 40     do
 41         form.SuspendLayout()
 42         glControl.Location <- new Point(10,40)
 43         glControl.Size <- new Size(400,300)
 44         glControl.BackColor <- Color.Red
 45         glControl.Resize.Add(form.resize)
 46         glControl.Paint.Add(form.paint)
 47         form.MouseWheel.Add(form.MouseDown)
 48         form.ClientSize <- new Size(600,400)
 49         form.Text <- "opengl"
 50         form.StartPosition <- FormStartPosition.Manual
 51         form.Location <- new Point(100,200)
 52         form.Controls.Add(glControl)
 53         form.ResumeLayout(false)
 54         labelX.Location <- new Point(420,40)
 55         labelY.Location <- new Point(420,70)
 56         labelZ.Location <- new Point(420,100)
 57         labelLR.Location <- new Point(420,130)
 58         labelUD.Location <- new Point(420,160)
 59         labelX.Text <- "X:"
 60         labelY.Text <- "Y:"
 61         labelZ.Text <- "Z:"
 62         labelLR.Text  <- "水平:"
 63         labelUD.Text <-"上下:"
 64         textX.Location <- new Point(460,40)
 65         textY.Location <- new Point(460,70)
 66         textZ.Location <- new Point(460,100)
 67         textLR.Location <- new Point(460,130)
 68         textUD.Location <- new Point(460,160)
 69         textInfo.Text <- "3"
 70         textInfo.Location <- new Point(420,190)
 71         textInfo.Width <- 140
 72         form.Controls.Add(textX)
 73         form.Controls.Add(textY)
 74         form.Controls.Add(textZ)
 75         form.Controls.Add(textLR)
 76         form.Controls.Add(textUD)
 77         form.Controls.Add(labelX)
 78         form.Controls.Add(labelY)
 79         form.Controls.Add(labelZ)
 80         form.Controls.Add(labelLR)
 81         form.Controls.Add(labelUD)
 82         form.Controls.Add(textInfo)
 83         //#endregion 
 84     override v.OnLoad e =
 85         base.OnLoad e
 86         GL.ClearColor Color.MidnightBlue
 87         Application.Idle.Add(v.AIdle)
 88         v.ShowUI        
 89         textX.TextChanged.Add(form.TextChange)
 90         textY.TextChanged.Add(form.TextChange)
 91         textZ.TextChanged.Add(form.TextChange)
 92         textLR.TextChanged.Add(form.TextChange)
 93         textUD.TextChanged.Add(form.TextChange)
 94         GL.FrontFace FrontFaceDirection.Ccw
 95         //设置材料面填充模式
 96         GL.PolygonMode(MaterialFace.Front,PolygonMode.Fill)
 97         GL.PolygonMode(MaterialFace.Back,PolygonMode.Line)
 98         //启用数组功能.
 99         GL.EnableClientState(ArrayCap.VertexArray)
100         //GL.EnableClientState(ArrayCap.ColorArray)
101         GL.EnableClientState(ArrayCap.IndexArray)
102         GL.Light(LightName.Light0,LightParameter.Ambient,[|0.f;1.f;1.f;1.f|])
103         GL.Light(LightName.Light0,LightParameter.Diffuse,[|1.f;0.f;1.f;1.f|])
104         GL.Light(LightName.Light0,LightParameter.Specular,[|0.f;0.f;1.f;1.f|])
105         GL.Light(LightName.Light0,LightParameter.SpotDirection,[|-1.f;-1.f;0.f|])
106         GL.Light(LightName.Light0,LightParameter.SpotCutoff,[|60|])
107 
108         GL.Light(LightName.Light1,LightParameter.Position,[|20.f;20.f;20.f;0.f|])         
109         GL.Light(LightName.Light1,LightParameter.Ambient,[|0.5f;0.5f;0.5f;1.f|])
110         GL.Light(LightName.Light1,LightParameter.Diffuse,[|0.5f;0.5f;0.5f;1.f|])
111         GL.Light(LightName.Light1,LightParameter.Specular,[|1.f;1.f;1.f;1.f|])
112         //GL.Light(LightName.Light0,LightParameter.Specular,[|1.f;0.f;1.f;1.f|])
113         //GL.Material(MaterialFace.Front,MaterialParameter.Ambient,[|1.f;1.f;1.f;1.f|])
114         GL.Enable(EnableCap.Lighting)
115         GL.Enable(EnableCap.Light0)
116         GL.Enable(EnableCap.Light1)
117         GL.Enable(EnableCap.DepthTest)
118 //#region ""
119     member v.resize (e:EventArgs) =
120         GL.Viewport(0,0,glControl.ClientSize.Width,glControl.ClientSize.Height)
121         let aspect = float32 glControl.ClientSize.Width /float32 glControl.ClientSize.Height
122         let mutable projection = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4,aspect,0.1f,64.f)
123         GL.MatrixMode MatrixMode.Projection
124         GL.LoadMatrix(&projection)
125     member v.paint (e:PaintEventArgs) =
126         v.Render()
127     member v.AIdle (e:EventArgs) =
128         while (glControl.IsIdle) do
129             v.Render()
130     member v.TextChange (e:EventArgs) =
131         x <- v.UIValue(textX)
132         y <- v.UIValue(textY)
133         z <- v.UIValue(textZ)
134     member v.MouseDown(e:MouseEventArgs) =
135         match v.ActiveControl with
136         | :? TextBox as t1 -> 
137             let mutable t = v.UIValue(t1)
138             t <- t + float32 e.Delta * offest * 0.01f
139             t1.Text <- t.ToString()
140         | _ -> 
141             v.Text <- v.ActiveControl.Text
142             let state =float32 e.Delta * offest * 0.01f
143             x<- x+state
144             y<- y + state
145             z <- z + state
146         v.ShowUI
147     member x.UIValue
148         with get (text:TextBox) = 
149             let mutable value = 0.f
150             if System.Single.TryParse(text.Text,&value) then
151                 value <- value
152             value
153         and set (text:TextBox) (value:float32) = text.Text<- value.ToString()
154     member v.ShowUI =
155         textX.Text <- x.ToString()
156         textY.Text <- y.ToString()
157         textZ.Text <- z.ToString()
158         textLR.Text <- v.UIValue(textLR).ToString()
159         textUD.Text <- v.UIValue(textUD).ToString()
160     member v.Render =
161         let mutable lookat = Matrix4.LookAt(new Vector3(x,y,z),Vector3.Zero,Vector3.UnitY)
162         GL.MatrixMode(MatrixMode.Modelview)
163         GL.LoadMatrix(&lookat)        
164         GL.Rotate(v.UIValue(textLR),0.f,1.f,0.f)
165         GL.Rotate(v.UIValue(textUD),1.f,0.f,0.f)
166         GL.Clear(ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit)
167         GL.Begin BeginMode.Lines
168         GL.Color3(Color.Black)
169         GL.Vertex3(Vector3.Zero)
170         GL.Vertex3(Vector3.UnitX * 1000.f)
171         GL.Color3(Color.White)
172         GL.Vertex3(Vector3.Zero)
173         GL.Vertex3(Vector3.UnitY * 1000.f)
174         GL.Color3(Color.Red)
175         GL.Vertex3(Vector3.Zero)
176         GL.Vertex3(Vector3.UnitZ * 1000.f)
177         GL.End()
178         r <- (r + 0.01f) % 360.f
179         textInfo.Text <- r.ToString()
180         GL.PushMatrix()
181         GL.Rotate(r,0.f,1.f,0.f)
182         GL.Light(LightName.Light0,LightParameter.Position,ll) 
183         GL.PushMatrix()
184         GL.Translate(ll.[0],ll.[1],ll.[2])
185         Glu.Sphere(q,1.0,20,20)
186         GL.PopMatrix()
187         GL.PopMatrix()
188         Glu.Sphere(q,3.0,20,20)
189         glControl.SwapBuffers()
190         ignore
191 let t = new loopForm()
192 t.Show()
View Code

 10.相关画圆,画立方体类.

  1 #r "D:\工程\OpenTK\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
  2 #r "D:\工程\OpenTK\1.0\Binaries\OpenTK\Debug\OpenTK.Compatibility.dll"
  3 #r "D:\工程\OpenTK\1.0\Binaries\OpenTK\Debug\OpenTK.GLControl.dll"
  4 
  5 open System
  6 open System.Collections.Generic
  7 open System.Windows.Forms
  8 open System.Threading
  9 open System.Drawing
 10 open System.Drawing.Imaging
 11 open OpenTK
 12 open OpenTK.Graphics
 13 open OpenTK.Graphics.OpenGL
 14 
 15 module Shape =
 16 
 17     type T2N3V3 =
 18         struct
 19             val mutable TexCoord : Vector2
 20             val mutable Normal : Vector3
 21             val mutable Position : Vector3
 22             new(v,n,p) = {TexCoord = v;Normal = n;Position = p}
 23         end
 24     [<AbstractClass>]
 25     type Shape() =
 26         let mutable bCreate = false
 27         let mutable vi = 0
 28         let mutable ei = 0
 29         let mutable count = 0
 30         member this.vboID with get() = vi and set value = vi <- value
 31         member this.eboID with get() = ei and set value = ei <- value
 32         member this.TriangelCount with get() = count and set value = count <- value
 33         member this.IsCreate with get() = bCreate and set value = bCreate <- value
 34         abstract Draw : unit -> unit
 35         abstract Init : unit -> unit
 36         member this.InitQ : unit -> unit =fun () -> ()
 37 
 38     type Sphere(radius:float32,level:int) =
 39         inherit Shape()
 40         let mutable rad,lev = radius,level
 41         let RightLevel = 
 42             if lev < 0 then lev <- 0
 43             elif lev > 6 then lev <-6
 44         override this.Draw() =  
 45             if this.IsCreate<>true then this.Init()
 46             GL.BindBuffer(BufferTarget.ArrayBuffer,this.vboID)
 47             GL.BindBuffer(BufferTarget.ElementArrayBuffer,this.eboID)
 48             GL.InterleavedArrays(InterleavedArrayFormat.T2fN3fV3f,0,IntPtr.Zero)
 49             GL.DrawElements(BeginMode.Triangles,this.TriangelCount,DrawElementsType.UnsignedInt,IntPtr.Zero)
 50         override this.Init() =
 51             let alls = Array.create 6 (new T2N3V3())
 52             alls.[0] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), Vector3.UnitX, Vector3.UnitX * rad )
 53             alls.[1] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), Vector3.UnitY, Vector3.UnitY * rad )
 54             alls.[2] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), Vector3.UnitZ, Vector3.UnitZ * rad )
 55             alls.[3] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), -Vector3.UnitX, -Vector3.UnitX * rad )
 56             alls.[4] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), -Vector3.UnitY, -Vector3.UnitY * rad )
 57             alls.[5] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), -Vector3.UnitZ, -Vector3.UnitZ * rad )
 58             let is = [| 
 59                             1;2;0
 60                             0;2;4
 61                             0;4;5
 62                             5;1;0
 63                             1;3;2
 64                             4;2;3
 65                             4;3;5
 66                             1;5;3
 67                         |]
 68             let (vvv:T2N3V3 []),(iv: int[]) = this.Sub (alls,is)
 69             let mutable vID,eID = 0,0
 70             //let mutable tv,vv,pv = vvv |> Array.map (fun v -> v.TexCoord,v.Normal,v.Position) |> Array.unzip3            
 71             GL.GenBuffers(1,&vID) 
 72             GL.BindBuffer(BufferTarget.ArrayBuffer,vID)
 73             GL.BufferData(BufferTarget.ArrayBuffer,IntPtr (4 * 8 * vvv.Length),vvv,BufferUsageHint.StaticDraw)
 74             
 75             GL.GenBuffers(1,&eID)
 76             GL.BindBuffer(BufferTarget.ElementArrayBuffer,eID)
 77             GL.BufferData(BufferTarget.ElementArrayBuffer,IntPtr (4 * iv.Length),iv,BufferUsageHint.StaticDraw)
 78 
 79             this.vboID <- vID
 80             this.eboID <- eID
 81             this.TriangelCount <- iv.Length 
 82             this.IsCreate <- true
 83             ()
 84          member v.GetMidValue (first:T2N3V3,second:T2N3V3) =
 85             let midN = Vector3.Lerp(first.Position,second.Position,0.5f) |> Vector3.Normalize
 86             let midP = midN *(float32 rad)
 87             let midT = Vector2.Lerp(first.TexCoord,second.TexCoord,0.5f) |> Vector2.Normalize
 88             let result = new T2N3V3(midT,midN,midP)
 89             result
 90         member v.Subdivide (v1:T2N3V3,v2:T2N3V3,v3:T2N3V3) =
 91             let vs = Array.create 6 (new T2N3V3())
 92             vs.[0] <- v1
 93             vs.[1] <- v.GetMidValue(v1,v2)
 94             vs.[2] <- v.GetMidValue(v3,v1)
 95             vs.[3] <- v2
 96             vs.[4] <- v.GetMidValue(v2,v3)
 97             vs.[5] <- v3
 98             let is = Array.create 12 0
 99             is.[0] <- 0
100             is.[1] <- 1
101             is.[2] <- 2
102             is.[3] <- 2
103             is.[4] <- 1
104             is.[5] <- 4
105             is.[6] <- 4
106             is.[7] <- 1
107             is.[8] <- 3
108             is.[9] <- 2
109             is.[10] <-4
110             is.[11] <- 5
111             (vs,is)
112         member this.Sub(alls:T2N3V3 [],is:int []) =
113             //let mutable tv,vv,pv = alls |> Array.map (fun v -> v.TexCoord,v.Normal,v.Position) |> Array.unzip3
114             let mutable allv = alls
115             let mutable iv = is
116             let show array = printfn "%A" array
117             for j in 0 .. lev do
118                 let mutable av = Array.create 0 (new T2N3V3())
119                 let mutable ev = Array.create 0 0
120                 printfn "%i" allv.Length
121                 printfn "%i" iv.Length
122                 for i in 0 .. 3 .. iv.Length - 1 do
123                     let (vvv,iiv) = this.Subdivide(allv.[iv.[i]],allv.[iv.[i+1]],allv.[iv.[i+2]])
124                     let length = av.Length
125                     av <- Array.append av vvv
126                     let map = iiv |> Array.map (fun p -> p + length)
127                     ev <- Array.append ev map
128                 allv <- av
129                 iv <- ev 
130                 allv |> Array.map (fun p -> p.Position) |> show
131                 show iv
132             allv,iv
133 
134     type Cube(width:float32,height:float32,length:float32,index:int) =
135         inherit Shape()
136         let mutable id = index
137         let xl,yl,zl =width/2.f,height/2.f,length/2.f
138         let mutable color = Color.White
139         let v8 = [|
140                         new Vector3(xl,yl,zl)
141                         new Vector3(-xl,yl,zl)
142                         new Vector3(-xl,-yl,zl)
143                         new Vector3(xl,-yl,zl)
144                         new Vector3(xl,yl,-zl)
145                         new Vector3(-xl,yl,-zl)
146                         new Vector3(-xl,-yl,-zl)
147                         new Vector3(xl,-yl,-zl)
148                     |]
149         new(x,y,z) =
150             let rnd = System.Random().Next()
151             printfn "%i" rnd
152             Cube(x,y,z,-1)
153         override this.Draw() = 
154             if this.IsCreate<>true then this.Init()
155             GL.EnableClientState(ArrayCap.VertexArray)
156             GL.EnableClientState(ArrayCap.NormalArray)
157             GL.BindBuffer(BufferTarget.ArrayBuffer,this.vboID)
158             GL.VertexPointer(3,VertexPointerType.Float,0,IntPtr.Zero)
159             GL.PushMatrix()
160             if id >= 0 && id < 8 then
161                 GL.Translate(v8.[id])
162             GL.Color3(this.Color:Color)
163             GL.Normal3(Vector3.UnitZ)
164             GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|0;1;2;0;2;3|])
165             //GL.Color3(Color.Black)
166             GL.Normal3(Vector3.UnitY)
167             GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|4;5;1;4;1;0|])
168             //GL.Color3(Color.Red)
169             GL.Normal3(Vector3.UnitX)
170             GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|4;0;3;4;3;7|])
171             //GL.Color3(Color.Green)
172             GL.Normal3(-Vector3.UnitY)
173             GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|3;2;6;3;6;7|])
174             //GL.Color3(Color.Blue)
175             GL.Normal3(-Vector3.UnitX)
176             GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|1;5;6;1;6;2|])
177             //GL.Color3(Color.DodgerBlue)
178             GL.Normal3(-Vector3.UnitZ)
179             GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|5;4;7;5;7;6|])
180             GL.PopMatrix()
181         override this.Init() =
182             let mutable vID = 0
183             GL.GenBuffers(1,&vID) 
184             GL.BindBuffer(BufferTarget.ArrayBuffer,vID)
185             GL.BufferData(BufferTarget.ArrayBuffer,IntPtr (4 * 3 * v8.Length),v8,BufferUsageHint.StaticDraw)
186             this.vboID <- vID
187             this.IsCreate <- true    
188             let rnd = System.Random(this.GetHashCode())
189             this.Color <- Color.FromArgb(rnd.Next(0,255),rnd.Next(0,255),rnd.Next(0,255))
190             ()
191         member this.Index with get() = id and set value = id <-value
192         member this.Color with get() = color and set value = color <- value
193 
194     type Camera() = 
195         let mutable eye = Vector3.Zero
196         let mutable eyeLength = 10.
197         let mutable yangle = 0.
198         let mutable xangle= Math.PI/2.
199         member this.Eye 
200             with get() = eye 
201             and set value = eye <- value
202         member this.EyeLength 
203             with get() = eyeLength 
204             and set value = 
205                 if value < 0. then eyeLength <- 0.1
206                 eyeLength <- value
207         member this.YAngle 
208             with get() = yangle
209             and set value = 
210                 if value >= Math.PI then yangle <- 0.
211                 //elif value <= 0. then yangle <- Math.PI - 0.1
212                 else yangle <- value
213         member this.XAngle 
214             with get() = xangle
215             and set value = 
216                 if value >= 2.* Math.PI then xangle <- 0.
217                 //elif value <= 0. then yangle <- 2. * Math.PI - 0.1
218                 else xangle <- value
219         member this.Target 
220             with get() = 
221                 //printfn "%f" this.XAngle 
222                 let x:float =float eye.X + eyeLength * Math.Cos(this.YAngle)* Math.Cos(this.XAngle)
223                 let y:float =float eye.Y + eyeLength * Math.Sin(this.YAngle)
224                 let z:float =float eye.Z + eyeLength * Math.Cos(this.YAngle)* Math.Sin(this.XAngle)
225                 Vector3(float32 x,float32 y,float32 z)
226         member this.Transelt (x,y,z) = 
227             let sinX = Math.Sin(this.XAngle)
228             let cosX = Math.Cos(this.XAngle)
229             let x1 = float this.Eye.X + x * sinX + z * cosX
230             let y1 = float this.Eye.Y + y
231             let z1 = float this.Eye.Z + z * sinX + x * cosX
232             printfn "angle:%f, sinx:%f, cosx:%f" x y z
233             printfn "x:%f, y:%f, z:%f" this.Eye.X this.Eye.Y this.Eye.Z
234             this.Eye <- new Vector3(float32 x1,float32 y1,float32 z1)
235         member this.UpAndDown y =
236             let ya = this.YAngle + y
237             this.YAngle <- ya
238         member this.RightAndLeft x =
239             let xa = this.XAngle + x
240             this.XAngle <- xa
241         member this.Rotate (x,y) =
242             let xa = this.XAngle + x
243             let ya = this.YAngle + y
244             this.YAngle <- ya
245             this.XAngle <- xa
View Code

11...

  1 #r "D:\工程\OpenTK\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
  2 #r "D:\工程\OpenTK\1.0\Binaries\OpenTK\Debug\OpenTK.GLControl.dll"
  3 #load "Shape.fsx"
  4 
  5 open System
  6 open System.Collections.Generic
  7 open System.Windows.Forms
  8 open System.Threading
  9 open System.Drawing
 10 open System.Drawing.Imaging
 11 open OpenTK
 12 open OpenTK.Graphics
 13 open OpenTK.Graphics.OpenGL
 14 open Shape
 15 
 16 type loopForm() as form=
 17     inherit Form()
 18     let caram = Shape.Camera()
 19     let offest = 0.1f
 20     let offestd = float offest
 21     let glControl = new OpenTK.GLControl()
 22 
 23     let cubeEnter = Shape.Cube(1.5f,0.2f,1.8f,3)
 24     let cubeParlor = Shape.Cube(4.9f,0.2f,6.3f,3)
 25     let cubeBalcony1 = Shape.Cube(4.9f,0.2f,1.9f,3)
 26     let cubeBalcony2 = Shape.Cube(1.6f,0.2f,2.1f,3)
 27     let cubeBalcony3 = Shape.Cube(1.8f,0.2f,3.0f,3)
 28     let cubeKitchen = Shape.Cube(4.5f,0.2f,1.8f,3)
 29     let cubeBathroom = Shape.Cube(2.1f,0.2f,2.1f,3)
 30     let cubeGallery = Shape.Cube(2.1f,0.2f,1.2f,3)
 31     let cubeMasterBedroom = Shape.Cube(3.6f,0.2f,3.9f,3)
 32     let cubeSecondbedroom = Shape.Cube(3.0f,0.2f,3.3f,3)
 33 
 34     let cubeWall1 = Shape.Cube(0.2f,3.f,8.1f,0)
 35     let cubeWall2 = Shape.Cube(4.5f,3.f,0.2f,0)
 36     let cubeWall3 = Shape.Cube(0.2f,3.f,1.8f,0)
 37     let cubeWall4 = Shape.Cube(0.2f,1.8f,1.8f,0)
 38     let cubeWall5 = Shape.Cube(3.0f,3.f,0.2f,0)
 39     let cubeWall6 = Shape.Cube(0.2f,3.f,3.7f,0)
 40     let cubeBathroom1 = Shape.Cube(2.1f,3.f,0.2f,0)
 41     let cubeBathroom2 = Shape.Cube(0.2f,3.f,2.1f,0)
 42     let cubeFence1 = Shape.Cube(0.05f,0.02f,1.9f,0)
 43     let cubeFence2 = Shape.Cube(2.3f,0.02f,0.05f,0)
 44     let cubeFence3 = Shape.Cube(0.05f,0.02f,2.1f,0)
 45     let cubeFence4 = Shape.Cube(3.4f,0.02f,0.05f,0)
 46     let cubeWall7 = Shape.Cube(2.1f,3.f,0.2f,4)
 47     let cubeWall8 = Shape.Cube(0.2f,3.f,3.0f,0)
 48     let cubePillar = Shape.Cube(0.2f,3.f,0.2f,4)
 49     let cubePillar2 = Shape.Cube(0.1f,1.1f,0.2f,4)
 50     let mutable oldMouseLocation = Vector2.Zero
 51     let path = [|
 52                    "D:\工程\OpenTK\1.0\ConsoleApplication1\白墙.jpg"
 53                    "D:\工程\OpenTK\1.0\ConsoleApplication1\电视墙.jpg"
 54                    "D:\工程\OpenTK\1.0\ConsoleApplication1\客厅.jpg"
 55                |]
 56     let mutable texs = Array.create path.Length 0 
 57     do
 58         caram.Transelt(1.,1.7,0.0)
 59         form.SuspendLayout()
 60         glControl.Location <- new Point(10,40)
 61         glControl.Size <- new Size(400,300)
 62         glControl.BackColor <- Color.Red
 63         glControl.Resize.Add(form.resize)
 64         glControl.Paint.Add(form.paint)
 65         glControl.KeyDown.Add(form.KeyDown)
 66         glControl.MouseMove.Add(form.MouseDownv)
 67         form.ClientSize <- new Size(450,350)
 68         form.Text <- "opengl"
 69         //form.StartPosition <- FormStartPosition.Manual
 70         form.Location <- new Point(1200,600)
 71         form.Controls.Add(glControl)
 72         form.ResumeLayout(false)
 73         //#endregion 
 74     override v.OnLoad e =
 75         base.OnLoad e
 76         GL.ClearColor Color.MidnightBlue
 77         Application.Idle.Add(v.AIdle)
 78         GL.FrontFace FrontFaceDirection.Ccw
 79         GL.Enable( EnableCap.PointSmooth )
 80         GL.Enable EnableCap.Texture2D
 81         //GL.Enable EnableCap.Lighting
 82         //踢除正反面
 83         GL.Enable EnableCap.CullFace
 84         GL.CullFace CullFaceMode.Back
 85         //设置材料面填充模式
 86         GL.PolygonMode(MaterialFace.Front,PolygonMode.Fill)
 87         GL.PolygonMode(MaterialFace.Back,PolygonMode.Line)
 88         texs <- Shape.TexTure.Load(path)
 89         GL.Light(LightName.Light0,LightParameter.Position,[|20.f;20.f;20.f;0.f|])         
 90         GL.Light(LightName.Light0,LightParameter.Ambient,[|0.5f;0.5f;0.5f;1.f|])
 91         GL.Light(LightName.Light0,LightParameter.Diffuse,[|0.5f;0.5f;0.5f;1.f|])
 92         GL.Light(LightName.Light0,LightParameter.Specular,[|1.f;1.f;1.f;1.f|])
 93         GL.Enable(EnableCap.Lighting)
 94         //GL.Enable(EnableCap.Light0)
 95         GL.Enable(EnableCap.DepthTest)
 96 
 97 //#region
 98     member v.resize (e:EventArgs) =
 99         GL.Viewport(0,0,glControl.ClientSize.Width,glControl.ClientSize.Height)
100         let aspect = float32 glControl.ClientSize.Width /float32 glControl.ClientSize.Height
101         let mutable projection = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver2,aspect,0.1f,30.f)
102         GL.MatrixMode MatrixMode.Projection
103         GL.LoadMatrix(&projection)
104     member v.paint (e:PaintEventArgs) =
105         v.Render()
106     member v.AIdle (e:EventArgs) =
107         while (glControl.IsIdle) do
108             v.Render()
109     member v.MouseDownv(e:MouseEventArgs) =
110         if e.Button = MouseButtons.Right then
111             if oldMouseLocation = Vector2.Zero then
112                 oldMouseLocation <- Vector2(float32 e.X,float32 e.Y)
113             else
114                 let nx = (float32 e.X - oldMouseLocation.X) * offest * 0.1f
115                 let ny = (float32 e.Y - oldMouseLocation.Y) * offest * -0.1f
116                 caram.Rotate(float nx,float ny)
117         oldMouseLocation <- Vector2(float32 e.X,float32 e.Y)     
118     member v.KeyDown(e:KeyEventArgs) =
119         //let keys = e.KeyData
120         match e.KeyCode with
121         | Keys.E ->caram.Transelt(0.,0.,1.* offestd)
122         | Keys.D ->caram.Transelt(0.,0.,-1.* offestd)
123         | Keys.S ->caram.Transelt(1.* offestd,0.,0.0)
124         | Keys.F ->caram.Transelt(-1.* offestd,0.,0.)
125         //| Keys.Space -> caram.Transelt()
126         | _ -> ()
127     member x.UIValue
128         with get (text:TextBox) = 
129             let mutable value = 0.f
130             if System.Single.TryParse(text.Text,&value) then
131                 value <- value
132             value
133         and set (text:TextBox) (value:float32) = text.Text<- value.ToString()
134 //#endregion        
135     member v.Render =
136         //Keyboard[OpenTK.Input.Key.F11]
137         GL.Clear(ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit)
138         //地面
139         //v.DrawCube(cubeEnter,Vector3.Zero)
140         v.DrawCube(cubeEnter,0.f,0.f,0.f,0,texs.[0])
141         v.DrawCube(cubeParlor,0.f,0.f,1.8f)
142         v.DrawCube(cubeBalcony1,0.f,0.f,8.1f)
143         v.DrawCube(cubeBalcony2,2.3f,0.f,10.f)
144         v.DrawCube(cubeBalcony3,3.9f,0.f,9.f)
145         v.DrawCube(cubeKitchen,1.5f,0.f,0.f)
146         v.DrawCube(cubeBathroom,3.9f,0.f,1.8f)
147         v.DrawCube(cubeGallery,3.9f,0.f,3.9f)
148         v.DrawCube(cubeMasterBedroom,3.9f,0.f,5.1f)
149         v.DrawCube(cubeSecondbedroom,6.0f,0.f,1.8f)  
150         //墙
151         v.DrawCube(cubeWall1,Vector3.Zero)
152         //v.DrawCube(cubeWall2,Vector3(1.5f,0.f,0.f))
153         v.DrawCube(cubeWall2,1.5f,0.f,0.f,0,texs.[2])
154         v.DrawCube(cubeWall3,Vector3(1.5f,0.f,0.f))
155         v.DrawCube(cubeWall4,Vector3(6.0f,0.f,0.f))
156         v.DrawCube(cubeWall5,Vector3(6.0f,0.f,1.8f))
157         v.DrawCube(cubeWall6,Vector3(9.0f,0.f,1.8f))
158         v.DrawCube(cubeWall6,Vector3(7.5f,0.f,5.1f))
159         v.DrawCube(cubeWall6,Vector3(3.9f,0.f,5.1f))        
160         v.DrawCube(cubeWall7,Vector3(3.9f,0.f,9.0f))
161         v.DrawCube(cubeWall8,Vector3(6.0f,0.f,9.0f))
162         v.DrawCube(cubeBathroom1,Vector3(3.9f,0.f,1.8f))
163         //v.DrawCube(cubeBathroom1,Vector3(3.9f,0.f,3.9f))
164         v.DrawCube(cubeBathroom2,Vector3(3.9f,0.f,1.8f))
165         v.DrawCube(cubeBathroom2,Vector3(6.0f,0.f,1.8f))
166         v.DrawCube(cubeFence1,0.0f,1.f,8.1f)  
167         v.DrawCube(cubeFence2,0.0f,1.f,10.f)  
168         v.DrawCube(cubeFence3,2.3f,1.f,10.f)  
169         v.DrawCube(cubeFence4,2.3f,1.f,12.1f)  
170         v.DrawCube(cubePillar,Vector3(2.3f,0.f,12.f))
171         v.DrawCube(cubePillar,Vector3(2.3f,0.f,9.9f))
172         v.DrawCube(cubePillar2,Vector3(0.f,0.f,9.9f))
173         //房顶
174         GL.PushMatrix()
175         GL.Translate(0.f,3.f,0.f)
176         v.DrawCube(cubeEnter,Vector3.Zero)
177         v.DrawCube(cubeParlor,0.f,0.f,1.8f)
178         v.DrawCube(cubeBalcony1,0.f,0.f,8.1f)
179         v.DrawCube(cubeBalcony2,2.3f,0.f,10.f)
180         v.DrawCube(cubeBalcony3,3.9f,0.f,9.f)
181         v.DrawCube(cubeKitchen,1.5f,0.f,0.f)
182         v.DrawCube(cubeBathroom,3.9f,0.f,1.8f)
183         v.DrawCube(cubeGallery,3.9f,0.f,3.9f)
184         v.DrawCube(cubeMasterBedroom,3.9f,0.f,5.1f)
185         v.DrawCube(cubeSecondbedroom,6.0f,0.f,1.8f)   
186         GL.PopMatrix()             
187         let mutable lookat = Matrix4.LookAt(caram.Eye,caram.Target,Vector3.UnitY)
188         GL.MatrixMode(MatrixMode.Modelview)
189         GL.LoadMatrix(&lookat)  
190         glControl.SwapBuffers()
191         ignore
192     member v.DrawCube(cube:Shape.Cube,pos:Vector3) =
193         v.DrawCube(cube,pos,cube.Index)
194     member v.DrawCube(cube:Shape.Cube,x,y,z) =
195         v.DrawCube(cube,new Vector3(x,y,z),cube.Index)
196     member v.DrawCube(cube:Shape.Cube,x,y,z,ind) =
197         v.DrawCube(cube,new Vector3(x,y,z),ind)
198     member v.DrawCube(cube:Shape.Cube, pos:Vector3, ind:int) =
199         GL.PushMatrix()
200         cube.Index <- ind
201         GL.Translate(pos)
202         cube.Draw()
203         GL.PopMatrix()
204     member v.DrawCube(cube:Shape.Cube,x,y,z,ind:int,tid:int) =
205         GL.PushMatrix()
206         GL.Translate(Vector3(x,y,z))
207         cube.DrawTexTure(ind,tid,Shape.TexTure.GenTexture)
208         GL.PopMatrix()
209 let t = new loopForm()
210 t.Show()
211             GL.Enable(EnableCap.TextureGenS)
212             GL.Enable(EnableCap.TextureGenT)
213             GL.TexGen(TextureCoordName.S,TextureGenParameter.TextureGenMode,int TextureGenMode.ObjectLinear)
214             GL.TexGen(TextureCoordName.T,TextureGenParameter.TextureGenMode,int TextureGenMode.ObjectLinear)
215             GL.TexGen(TextureCoordName.S,TextureGenParameter.ObjectPlane,[|1.f;0.f;0.f;0.f|])
216             GL.TexGen(TextureCoordName.T,TextureGenParameter.ObjectPlane,[|0.f;1.f;0.f;0.f|])
217          
View Code

 

type T

F# 图形数学基础。

这几天,在看Unity3D,很有意思,其中看到,第一人称控制器,就想看到里面的一些控制脚本是如何实现,才发现,学到的好多数据知识已经还给老师了,还好,走遍大江南北,跟着的书不多,唯一的二本高数没丢.

然后参考网上各个简洁明了的讲洁.

主要有 的从零实现3D图像引擎.

用此文只是用来记录一些向量,矩阵等的操作.没别的实际意义.会与我的学习来更新此文章.

1.求矩阵的逆矩阵。

type XMatrix3 =class val m11:floatval m12:floatval m13:floatval m21:floatval m22:floatval m23:floatval m31:floatval m32:floatval m33:float//new (x11,x12,x21,x22) = XMatrix(this.m11 = x11;this.m12 = x12;this.m13 = 0.0;this.m21 = x21;this.m22 = x22;this.m23 = 0.0;this.m31 = 0.0;this.m32 = 0.0;this.m33 = 1.0)new (x11,x12,x13,x21,x22,x23,x31,x32,x33) = {m11 = x11;m12 = x12;m13 = x13;m21 = x21;m22 = x22;m23 = x23;m31 = x31;m32 = x32;m33 = x33}new (x11,x12,x21,x22) = {m11 = x11;m12 = x12;m13 = 0.0;m21 = x21;m22 = x22;m23 = 0.0;m31 = 0.0;m32 = 0.0;m33 = 1.0}//求行列式                         member r.Det = r.m11*(r.m22*r.m33 - r.m32*r.m23) - r.m12*(r.m21*r.m33 - r.m31*r.m23) + r.m13*(r.m21*r.m32 - r.m31*r.m22)member r.Inverse = let det = r.Detlet det_inv = 1.0/detnew XMatrix3((r.m22*r.m33 - r.m32*r.m23)*det_inv,-(r.m12*r.m33 - r.m32*r.m13)*det_inv,(r.m12*r.m23 - r.m22*r.m13)*det_inv,-(r.m21*r.m33 - r.m31*r.m23)*det_inv,(r.m11*r.m33 - r.m31*r.m13)*det_inv,-(r.m11*r.m23 - r.m21*r.m13)*det_inv,(r.m21*r.m32 - r.m31*r.m22)*det_inv,-(r.m11*r.m32 - r.m31*r.m12)*det_inv,(r.m11*r.m22 - r.m21*r.m12)*det_inv)   endlet a = XMatrix3(1.0,2.0,-1.0,3.0,1.0,0.0,-1.0,0.0,-2.0)
let d = a.Detlet v = XMatrix3(3.0,-4.0,1.0,-2.0)
let s = v.Inverse
let ss = s.m11,s.m12,s.m21,s.m22
View Code

2.求二线段有没交点。交点的位置。这个看从零系列文章的时候,开始没想通怎么到作者是如何来求t1,t2那一步的,然后用F#自己来推导,原来如此。

type XPoint2 = val x:floatval y:floatnew (a,b) = {x = a;y = b}type XVector2 = val x:floatval y:floatnew (a,b) = {x = a;y = b}type XSegment2 =val p0: XPoint2val p1: XPoint2new (ps,pe) = {p0= ps;p1=pe}member m.v with get() = new XVector2(m.p1.x-m.p0.x,m.p1.y - m.p0.y)member m.paramLine//参数化直线with get() = fun(t) -> new XPoint2(m.p0.x + t*m.v.x,m.p0.y+t*m.v.y) static member Intersect (s1:XSegment2,s2:XSegment2) = //let x1 t1 = s1.p0.x + s1.v.x* t1//let y1 t1 = s1.p0.y + s1.v.y* t1//let x2 t2 = s2.p0.x + s2.v.x* t2//let y2 t2 = s2.p0.y + s2.v.y* t2//s1.paramLine(t1).x - s2.paramLine(t1).x //s1.paramLine(t1).y = s2.paramLine(t1).y//交点//let x_ = fun(t1,t2) -> s1.v.x* t1 - s2.v.x* t2 + s1.p0.x - s2.p0.x = 0//let y_ = fun(t1,t2) -> s1.v.y* t1 - s2.v.y* t2 + s2.p0.y - s2.p0.y = 0//用矩阵来求方阵式let xy = new XMatrix3(s1.v.x,-s2.v.x,s1.v.y,-s2.v.y)let xyI = xy.Inverselet a = s2.p0.x - s1.p0.xlet b = s2.p0.y - s1.p0.ylet t1 = xyI.m11 * a + xyI.m12 * blet t2 = xyI.m21 * a + xyI.m22 * bt1,t2,s1.paramLine(t1),s2.paramLine(t2)let x1 = XSegment2(XPoint2(4.0,4.0),XPoint2(2.0,6.0))
let x2 = XSegment2(XPoint2(4.0,2.0),XPoint2(6.0,4.0))let q,w,e,r = XSegment2.Intersect(x1,x2)
let show = e.x,e.y,r.x,r.y
View Code

val x1 : XMath.XSegment2
val x2 : XMath.XSegment2
val w : float = 0.5
val r : XMath.XPoint2
val q : float = -0.5
val e : XMath.XPoint2
val it : float * float * float * float = (5.0, 3.0, 5.0, 3.0)

3.向量点乘(内积)r = (a,b,c)*(x,y,z)=ax+by+cz,是一个标量,不具有方向了。有如下关系,cos@=r/(|a,b,c|*|x,y,z|).而cos@=一边的投影长度/另一边。所以用来求二个向量之间投影向量与对应的法向量。

向量叉乘(叉积)r=(a,b,c)*(x,y,z)=(bz-yc,-az+xc,ay-bx).是一个向量,有如下关系,sin@=|r|/(|a,b,c|*|x,y,z|).其中r与向量(a,b,c),(x,y,z)互相垂直。

二个向量的叉积结合相应坐标系来看,就是各项的代数余子式。

4.OpenGL里的摄像机与透视矩阵.

用F#实现OpenTK上的一个小例子。相关代码是画一个立方体,然后不断旋转。

用的OpenGL,对应的是列向量,右手坐标系。

相关个人理解,不论是OpenGL或是D3D,人站在地面上,在3维里,XZ面是表示地面,Z用来表示远近(人眼看的远近),Y用来表示高度。我们眼中看到的平面应该平行于XY面。人相当于是地面(XZ面)的法向量。

而透视投影用在实际当中来说,人眼选择一个近处1米到远处10米的所有物体,在这当中所有物体会影视到我们眼球表面。透视投影相当于就是计算视线内所有物体到眼球表面上的位置。

 1 #r "D:\Program Files\openTK\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
 2 open System
 3 open System.Collections.Generic
 4 open System.Windows.Forms
 5 open System.Drawing
 6 
 7 open OpenTK
 8 open OpenTK.Graphics
 9 open OpenTK.Graphics.OpenGL
10 
11 type ImmediateWindow() =
12     inherit GameWindow(800,600,new GraphicsMode(new ColorFormat(16),16))
13     do base.VSync <- VSyncMode.On
14     let rotation_speed = 180.0f
15     let mutable angle = 0.0f
16     override v.OnLoad e =
17         base.OnLoad(e)
18         GL.ClearColor(Color.MidnightBlue)
19         GL.Enable(EnableCap.DepthTest)
20     override v.OnResize e =
21         base.OnResize e
22         GL.Viewport(0,0,v.Width,v.Height)
23         let ratio = float32 v.Width/float32 v.Height
24         let mutable pective = Matrix4.CreatePerspectiveFieldOfView(float32 MathHelper.PiOver4,ratio,1.0f,64.0f)
25         GL.MatrixMode(MatrixMode.Projection)
26         GL.LoadMatrix(&pective)
27 
28     member v.DrawCube() =
29         GL.Begin(BeginMode.Quads);
30 
31         GL.Color3(Color.Silver);
32         GL.Vertex3(-1.0f, -1.0f, -1.0f);
33         GL.Vertex3(-1.0f, 1.0f, -1.0f);
34         GL.Vertex3(1.0f, 1.0f, -1.0f);
35         GL.Vertex3(1.0f, -1.0f, -1.0f);
36 
37         GL.Color3(Color.Honeydew);
38         GL.Vertex3(-1.0f, -1.0f, -1.0f);
39         GL.Vertex3(1.0f, -1.0f, -1.0f);
40         GL.Vertex3(1.0f, -1.0f, 1.0f);
41         GL.Vertex3(-1.0f, -1.0f, 1.0f);
42 
43         GL.Color3(Color.Moccasin);
44 
45         GL.Vertex3(-1.0f, -1.0f, -1.0f);
46         GL.Vertex3(-1.0f, -1.0f, 1.0f);
47         GL.Vertex3(-1.0f, 1.0f, 1.0f);
48         GL.Vertex3(-1.0f, 1.0f, -1.0f);
49 
50         GL.Color3(Color.IndianRed);
51         GL.Vertex3(-1.0f, -1.0f, 1.0f);
52         GL.Vertex3(1.0f, -1.0f, 1.0f);
53         GL.Vertex3(1.0f, 1.0f, 1.0f);
54         GL.Vertex3(-1.0f, 1.0f, 1.0f);
55 
56         GL.Color3(Color.PaleVioletRed);
57         GL.Vertex3(-1.0f, 1.0f, -1.0f);
58         GL.Vertex3(-1.0f, 1.0f, 1.0f);
59         GL.Vertex3(1.0f, 1.0f, 1.0f);
60         GL.Vertex3(1.0f, 1.0f, -1.0f);
61 
62         GL.Color3(Color.ForestGreen);
63         GL.Vertex3(1.0f, -1.0f, -1.0f);
64         GL.Vertex3(1.0f, 1.0f, -1.0f);
65         GL.Vertex3(1.0f, 1.0f, 1.0f);
66         GL.Vertex3(1.0f, -1.0f, 1.0f);
67         GL.End();
68     override v.OnUpdateFrame e =
69         base.OnUpdateFrame e
70         if v.Keyboard.[OpenTK.Input.Key.Escape]
71         then 
72             v.Exit()   
73     override v.OnRenderFrame(e) =
74         base.OnRenderFrame e
75         GL.Clear (ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit)
76         let mutable eye = new Vector3(float32 0.0,float32 5.0,float32 5.0)
77         let mutable target = new Vector3(float32 0.0,float32 0.0,float32 0.0)
78         let mutable up = new Vector3(float32 0.0,float32 1.0,float32 0.0)
79         let mutable lookat = Matrix4.LookAt(0.f, 5.f, 5.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f);
80         GL.MatrixMode(MatrixMode.Modelview)
81         GL.LoadMatrix(&lookat)
82         angle <- angle + rotation_speed *(float32 e.Time)
83         GL.Rotate(angle,0.0f,1.0f,0.0f)
84         v.DrawCube()
85         v.SwapBuffers()
86 
87 let example = new ImmediateWindow()
88 do example.Run(30.)        
View Code

5.OpenGL里的矩阵变换.顺序,当前矩阵,主要变换.

 1 #r "D:\Program Files\openTK\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
 2 open System
 3 open System.Collections.Generic
 4 open System.Windows.Forms
 5 open System.Drawing
 6 
 7 open OpenTK
 8 open OpenTK.Graphics
 9 open OpenTK.Graphics.OpenGL
10 
11 type ImmediateWindow() =
12     inherit GameWindow(800,600,new GraphicsMode(new ColorFormat(16),16))
13     let num_lists = 13
14     let lists = Array.create num_lists 0//[|num_lists|]
15     override v.OnLoad e =
16         base.OnLoad(e)
17         GL.ClearColor(Color.MidnightBlue)
18         GL.Enable(EnableCap.DepthTest)
19         GL.MatrixMode(MatrixMode.Modelview)
20         GL.LoadIdentity()
21         let first_list = GL.GenLists(num_lists)
22         let mutable c = 0.
23         for i = 0 to num_lists-1 do
24             lists.[i] <- first_list + i
25             GL.NewList(first_list + i,ListMode.Compile)
26             GL.Color3(0.3+0.7*c*c,0.3+1.4*c*c,0.7-0.7*c*c)
27             c <- c+1./float num_lists
28             GL.PushMatrix()
29             GL.Rotate(c*360.,0.,0.,1.0)
30             GL.Translate(5.,0.,0.)
31             GL.Begin(BeginMode.Quads)
32             GL.Vertex3(-1.,-1.,1.)
33             GL.Vertex3(1.,-1.,1.)
34             GL.Vertex3(1.,1.,1.)
35             GL.Vertex3(-1.,1.,1.)
36             GL.End()
37             GL.PopMatrix()
38             GL.EndList()
39     override v.OnUnload e =
40         GL.DeleteLists(lists.[0],num_lists)
41     override v.OnResize e =
42         GL.Viewport(0,0,v.Width,v.Height)
43         let ratio = float32 v.Width/float32 v.Height
44         let mutable pective = Matrix4.CreatePerspectiveFieldOfView(float32 MathHelper.PiOver4,ratio,1.0f,64.0f)
45         GL.MatrixMode(MatrixMode.Projection)
46         GL.LoadMatrix(&pective)   
47     override v.OnUpdateFrame e =
48         base.OnUpdateFrame e
49         if v.Keyboard.[OpenTK.Input.Key.Escape]
50         then 
51             v.Exit()   
52     override v.OnRenderFrame(e) =
53        // base.OnRenderFrame e
54         //GL.Clear (ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit)
55         let mutable lookat = Matrix4.LookAt(0.f, 0.f, 16.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f);
56         GL.MatrixMode(MatrixMode.Modelview)
57         GL.LoadMatrix(&lookat)
58         GL.Clear(ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit);
59         GL.CallLists(num_lists, ListNameType.Int, lists);
60         v.SwapBuffers()
61 
62 let example = new ImmediateWindow()
63 do example.Run(30.)   
View Code

6.OpenGL里的缓冲区.

  1 #r "F:\3D\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
  2 
  3 open System
  4 open System.Collections.Generic
  5 open System.Windows.Forms
  6 open System.Threading
  7 open System.Drawing
  8 
  9 open OpenTK
 10 open OpenTK.Graphics
 11 open OpenTK.Graphics.OpenGL
 12 
 13 type VBO =
 14     struct  
 15         val mutable VboID : int 
 16         val mutable EboID : int  
 17         val mutable NumElements : int  
 18     end
 19 
 20 type VertexPositionColor =
 21     struct 
 22         val mutable Position : Vector3
 23         val mutable Color : uint32
 24         new(x,y,z,color:Color) = {Position = new Vector3(x,y,z);Color=VertexPositionColor.ToRgba(color)}
 25         static member ToRgba (color:Color) =
 26             uint32 color.A <<< 24 ||| uint32 color.B <<< 16 ||| uint32 color.G <<< 8 |||uint32 color.R           
 27     end
 28 
 29 type VBOWindow() =
 30     inherit GameWindow(400,300)
 31     let speed = 180.
 32     let mutable angle = 0.
 33     let CubeVertices = [| 
 34         new VertexPositionColor(-1.0f, -1.0f,  1.0f, Color.DarkRed);//0
 35         new VertexPositionColor( 1.0f, -1.0f,  1.0f, Color.DarkRed);//1
 36         new VertexPositionColor( 1.0f,  1.0f,  1.0f, Color.Gold);//2
 37         new VertexPositionColor(-1.0f,  1.0f,  1.0f, Color.Gold);//3
 38         new VertexPositionColor(-1.0f, -1.0f, -1.0f, Color.DarkRed);//4
 39         new VertexPositionColor( 1.0f, -1.0f, -1.0f, Color.DarkRed);//5
 40         new VertexPositionColor( 1.0f,  1.0f, -1.0f, Color.Gold);//6
 41         new VertexPositionColor(-1.0f,  1.0f, -1.0f, Color.Gold) |]//7
 42     let CubeElements  = [| 
 43             0s; 1s; 2s; 2s; 3s; 0s; // front face
 44             3s; 2s; 6s; 6s; 7s; 3s; // top face
 45             7s; 6s; 5s; 5s; 4s; 7s; // back face
 46             4s; 0s; 3s; 3s; 7s; 4s; // left face
 47             0s; 1s; 5s; 5s; 4s; 0s; // bottom face
 48             1s; 5s; 6s; 6s; 2s; 1s // right face 
 49             |]
 50     let mutable vbo = new VBO()
 51     override v.OnLoad e =
 52         base.OnLoad e
 53         let version = GL.GetString(StringName.Version)
 54         let major = int version.[0]
 55         let minor =int version.[2]
 56         if major <= 1 && minor < 5 then 
 57             v.Exit()
 58         GL.ClearColor(System.Drawing.Color.MidnightBlue)
 59         GL.Enable(EnableCap.DepthTest)
 60 
 61         GL.GenBuffers(1,&vbo.VboID)
 62         GL.BindBuffer(BufferTarget.ArrayBuffer,vbo.VboID)
 63         let mutable size = CubeVertices.Length * BlittableValueType.StrideOf(CubeVertices.[0]);
 64         GL.BufferData(BufferTarget.ArrayBuffer,new IntPtr(size),CubeVertices,BufferUsageHint.StaticDraw)
 65 
 66         GL.GenBuffers(1,&vbo.EboID)
 67         GL.BindBuffer(BufferTarget.ElementArrayBuffer,vbo.EboID)
 68         let mutable elementSize = CubeElements.Length * sizeof<int16>
 69         GL.BufferData(BufferTarget.ElementArrayBuffer,new IntPtr(elementSize),CubeElements,BufferUsageHint.StaticDraw)
 70 
 71         vbo.NumElements <- CubeElements.Length
 72     override v.OnResize e =
 73         base.OnResize e
 74         GL.Viewport(0,0,v.Width,v.Height)
 75         let aspect = float32 v.Width / float32 v.Height 
 76         let mutable projection = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4,aspect,1.f,64.f)
 77         GL.MatrixMode(MatrixMode.Projection)
 78         GL.LoadMatrix(&projection)
 79     override v.OnRenderFrame e =
 80         base.OnRenderFrame e
 81         GL.Clear(ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit)
 82         let mutable lookat = Matrix4.LookAt(new Vector3(0.f,5.f,5.f),Vector3.Zero,Vector3.UnitY)
 83         GL.MatrixMode(MatrixMode.Modelview)
 84         GL.LoadMatrix(&lookat)
 85 //        angle <- angle + speed * float e.Time
 86 //        GL.Rotate(angle,0.,1.,0.)
 87 //
 88 //        GL.EnableClientState ArrayCap.ColorArray
 89 //        GL.EnableClientState ArrayCap.VertexArray
 90 //        GL.BindBuffer(BufferTarget.ArrayBuffer,vbo.VboID)
 91 //        GL.BindBuffer(BufferTarget.ElementArrayBuffer,vbo.EboID)
 92 //        let size = BlittableValueType.StrideOf(CubeVertices.[0])
 93 //        GL.VertexPointer(3,VertexPointerType.Float,size,new IntPtr(0))
 94 //        GL.ColorPointer(4,ColorPointerType.UnsignedByte,size,new IntPtr(12))
 95 //        GL.DrawElements(BeginMode.Triangles,vbo.NumElements,DrawElementsType.UnsignedShort,IntPtr.Zero)
 96 
 97         GL.Begin(BeginMode.Triangles)
 98         GL.Color3(Color.Red)
 99         GL.Vertex3(-1.0f, -1.0f,  1.0f);//0
100         GL.Vertex3( 1.0f, -1.0f,  1.0f);//1
101         GL.Vertex3( 1.0f,  1.0f,  1.0f);//2        
102         GL.Vertex3( 1.0f,  1.0f,  1.0f);//2
103         GL.Vertex3( -1.0f,  1.0f,  1.0f);//3
104         GL.Vertex3(-1.0f, -1.0f,  1.0f);//0
105         GL.Color3(Color.Black)
106         GL.End()
107         v.SwapBuffers()
108 
109         
110 let vboWindow = new VBOWindow()
111 do vboWindow.Run()
View Code

 7.如何更新OpenGL里的缓冲区.

  1 #r "F:\3D\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
  2 open System
  3 open System.Collections.Generic
  4 open System.Windows.Forms
  5 open System.Threading
  6 open System.Drawing
  7 open OpenTK
  8 open OpenTK.Graphics
  9 open OpenTK.Graphics.OpenGL
 10 
 11 type VertexColor =
 12     struct
 13         val mutable R : byte
 14         val mutable G : byte
 15         val mutable B : byte
 16         val mutable A : byte
 17         val mutable Position : Vector3
 18         static member Size = 16 
 19     end
 20 
 21 type Location =
 22     struct
 23         val mutable Direction : Vector3
 24         val mutable Age : uint32
 25     end
 26 
 27 type DynamicWindow() =
 28     inherit GameWindow(400,300)
 29     static let mutable MaxCount = 20
 30     let mutable visibleCount = 0
 31     let VBO = Array.create MaxCount (new VertexColor())
 32     let Locations = Array.create MaxCount (new Location())
 33     let mutable handle = 0;
 34 
 35     override v.OnLoad e =
 36         GL.ClearColor(0.1f,0.f,0.1f,0.f)
 37         GL.Enable EnableCap.DepthTest
 38 
 39         GL.PointSize 5.f
 40         GL.Enable EnableCap.PointSmooth
 41         GL.Hint(HintTarget.PointSmoothHint,HintMode.Nicest)
 42         GL.EnableClientState ArrayCap.ColorArray
 43         GL.EnableClientState ArrayCap.VertexArray
 44 
 45         GL.GenBuffers(1,&handle)
 46         GL.BindBuffer(BufferTarget.ArrayBuffer,handle)
 47         GL.ColorPointer(4,ColorPointerType.UnsignedByte,VertexColor.Size,0)
 48         GL.VertexPointer(3,VertexPointerType.Float,VertexColor.Size,4)
 49 
 50         let rnd = new Random()
 51         let temp = Vector3.Zero
 52         let getRndByte() =
 53             let rnd = rnd.Next(0,255)
 54             byte rnd
 55         let getRndDir() =
 56             let rnd = (rnd.NextDouble()-0.5)*0.5
 57             float32 rnd
 58         for i = 0 to MaxCount - 1 do
 59             VBO.[i].R <- getRndByte()
 60             VBO.[i].G <- getRndByte()
 61             VBO.[i].B <- getRndByte()
 62             VBO.[i].A <- getRndByte()
 63             VBO.[i].Position <- Vector3.Zero
 64 
 65             Locations.[i].Direction <- new Vector3(getRndDir(),getRndDir(),getRndDir())
 66             Locations.[i].Age <- uint32 0
 67         visibleCount <- 0
 68     override v.OnResize e =
 69         GL.Viewport(0,0,v.Width,v.Height)    
 70         GL.MatrixMode MatrixMode.Projection
 71         let mutable pro = Matrix4.CreatePerspectiveFieldOfView(float32 MathHelper.PiOver4,float32 v.Width/ float32 v.Height,1.0f,50.f)
 72         GL.LoadMatrix(&pro)
 73         GL.MatrixMode MatrixMode.Modelview
 74         let mutable view = Matrix4.LookAt(Vector3.UnitZ,Vector3.Zero,Vector3.UnitY)
 75         GL.LoadMatrix(&view)
 76     override v.OnUpdateFrame e =
 77         if visibleCount < MaxCount then
 78             visibleCount <- visibleCount + 1
 79         let mutable temp = Vector3.Zero
 80         for i = MaxCount - visibleCount to MaxCount - 1 do
 81             if Locations.[i].Age >= uint32 MaxCount then
 82                 Locations.[i].Age <- uint32 0
 83                 VBO.[i].Position <- Vector3.Zero
 84             else
 85                 let max =Math.Max(Locations.[i].Direction.LengthFast * 10.f,1.f)
 86                 Locations.[i].Age <- uint32 max
 87                 Vector3.Multiply(&Locations.[i].Direction,float32 e.Time,&temp)
 88                 Vector3.Add(&VBO.[i].Position,&temp,&VBO.[i].Position)
 89     
 90     override v.OnRenderFrame e =
 91         v.Title <- visibleCount.ToString() + " Points."       
 92         (ClearBufferMask.ColorBufferBit |||ClearBufferMask.DepthBufferBit) |> GL.Clear
 93         GL.PushMatrix()
 94         GL.Translate(0.f,0.f,-5.f)
 95         GL.BufferData(BufferTarget.ArrayBuffer,IntPtr (VertexColor.Size * MaxCount),IntPtr.Zero,BufferUsageHint.StaticDraw)
 96         GL.BufferData(BufferTarget.ArrayBuffer,IntPtr (VertexColor.Size * MaxCount),VBO,BufferUsageHint.StaticDraw)
 97         GL.DrawArrays(BeginMode.Points,MaxCount - visibleCount,visibleCount)
 98         GL.PopMatrix()
 99         v.SwapBuffers()
100 
101 let w = new DynamicWindow()
102 do w.Run()
103  
View Code

 8.OpenGL纹理简单应用.

 1 #r "F:\3D\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
 2 open System
 3 open System.Collections.Generic
 4 open System.Windows.Forms
 5 open System.Threading
 6 open System.Drawing
 7 open System.Drawing.Imaging
 8 open OpenTK
 9 open OpenTK.Graphics
10 open OpenTK.Graphics.OpenGL
11 
12 type Textures() = 
13     inherit GameWindow(400,300)
14     let mutable texture = 0
15     let bitmap = new Bitmap(@"F:\3D\1.0\ConsoleApplication1\logo.jpg")
16     override v.OnLoad e =
17         GL.ClearColor Color.MidnightBlue
18         GL.Enable EnableCap.Texture2D
19         GL.Hint(HintTarget.PerspectiveCorrectionHint,HintMode.Nicest)
20 
21         GL.GenTextures(1,&texture)
22         GL.BindTexture(TextureTarget.Texture2D,texture)
23         let data = bitmap.LockBits(new System.Drawing.Rectangle(0,0,bitmap.Width,bitmap.Height),ImageLockMode.ReadOnly,System.Drawing.Imaging.PixelFormat.Format32bppArgb)
24         GL.TexImage2D(TextureTarget.Texture2D,0,PixelInternalFormat.Rgba, data.Width, data.Height, 0,
25             OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0)
26         bitmap.UnlockBits(data)
27         GL.TexParameter(TextureTarget.Texture2D,TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear)
28         GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear)
29     override v.OnResize e =
30         GL.Viewport(0,0,v.Width,v.Height)
31         GL.MatrixMode(MatrixMode.Projection)
32         GL.LoadIdentity()
33         GL.Ortho(-1.,1.,-1.,1.,0.,4.)
34     override v.OnRenderFrame e =
35         GL.Clear ClearBufferMask.ColorBufferBit
36         GL.MatrixMode(MatrixMode.Modelview)
37         GL.LoadIdentity()
38         GL.BindTexture(TextureTarget.Texture2D,texture)
39         GL.Color3(Color.White)
40         GL.Begin(BeginMode.Quads);
41         GL.TexCoord2(0.0f, 1.0f);
42         GL.Vertex2(-0.6f, -0.4f);
43         GL.TexCoord2(1.0f, 1.0f); 
44         GL.Vertex2(0.6f, -0.4f);
45         GL.TexCoord2(1.0f, 0.0f); 
46         GL.Vertex2(0.6f, 0.4f);
47         GL.TexCoord2(0.0f, 0.0f); 
48         GL.Vertex2(-0.6f, 0.4f);
49         GL.End();
50         v.SwapBuffers()
51 
52 let t = new Textures()
53 do t.Run()
View Code

 9.启用OpenTK里的GLControl.

  1 #r "F:\3D\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
  2 #r "F:\3D\1.0\Binaries\OpenTK\Debug\OpenTK.GLControl.dll"
  3 
  4 open System
  5 open System.Collections.Generic
  6 open System.Windows.Forms
  7 open System.Threading
  8 open System.Drawing
  9 open System.Drawing.Imaging
 10 open OpenTK
 11 open OpenTK.Graphics
 12 open OpenTK.Graphics.OpenGL
 13 
 14 type loopForm() as form=
 15     inherit Form()
 16     let mutable x = 5.f
 17     let mutable y = 5.f
 18     let mutable z = 10.f
 19     let offest = 1.f
 20     let glControl = new OpenTK.GLControl()
 21     let textX= new TextBox()
 22     let textY= new TextBox()
 23     let textZ= new TextBox()
 24     let textLR = new TextBox()
 25     let textUD= new TextBox()
 26     let labelX= new Label()
 27     let labelY= new Label()
 28     let labelZ= new Label()
 29     let labelLR = new Label()
 30     let labelUD= new Label()
 31     let aArray = [| 
 32                             1.f;1.f;1.f
 33                             -1.f;1.f;1.f
 34                             -1.f;-1.f;1.f
 35                             1.f;-1.f;1.f
 36                             1.f;1.f;-1.f
 37                             1.f;1.f;1.f
 38                             1.f;-1.f;1.f
 39                             1.f;-1.f;-1.f
 40                             1.f;1.f;-1.f
 41                             -1.f;1.f;-1.f
 42                             -1.f;1.f;1.f
 43                             1.f;1.f;1.f
 44                             -1.f;1.f;-1.f
 45                             1.f;1.f;-1.f
 46                             1.f;-1.f;-1.f
 47                             -1.f;-1.f;-1.f
 48                         |]
 49     let vArray = [| 
 50                             1.f;1.f;1.f
 51                             -1.f;1.f;1.f
 52                             -1.f;-1.f;1.f
 53                             1.f;-1.f;1.f
 54                             1.f;1.f;-1.f
 55                             1.f;-1.f;-1.f      
 56                             -1.f;1.f;-1.f
 57                             -1.f;-1.f;-1.f                     
 58                         |]
 59     let iArray = [|
 60                             0u;1u;2u;3u;
 61                             4u;0u;3u;5u;
 62                             4u;6u;1u;0u;
 63                             6u;4u;5u;7u;
 64                       |]
 65 
 66     let cArray = [| 
 67                             1.f;1.f;1.f
 68                             1.f;0.f;0.f
 69                             0.f;1.f;0.f
 70                             0.f;0.f;1.f
 71                             1.f;1.f;0.f
 72                             0.f;1.f;1.f
 73                             1.f;0.f;1.f
 74                             0.f;0.f;0.f
 75                         |]
 76     do
 77         form.SuspendLayout()
 78         glControl.Location <- new Point(10,40)
 79         glControl.Size <- new Size(400,300)
 80         glControl.BackColor <- Color.Red
 81         glControl.Resize.Add(form.resize)
 82         glControl.Paint.Add(form.paint)
 83         form.MouseWheel.Add(form.MouseDown)
 84         glControl.Text <- "xxxxxx"
 85         form.ClientSize <- new Size(600,400)
 86         form.Text <- "opengl"
 87         form.StartPosition <- FormStartPosition.Manual
 88         form.Location <- new Point(1200,600)
 89         form.Controls.Add(glControl)
 90         form.ResumeLayout(false)
 91         labelX.Location <- new Point(420,40)
 92         labelY.Location <- new Point(420,70)
 93         labelZ.Location <- new Point(420,100)
 94         labelLR.Location <- new Point(420,130)
 95         labelUD.Location <- new Point(420,160)
 96         labelX.Text <- "X:"
 97         labelY.Text <- "Y:"
 98         labelZ.Text <- "Z:"
 99         labelLR.Text  <- "水平:"
100         labelUD.Text <-"上下:"
101         textX.Location <- new Point(460,40)
102         textY.Location <- new Point(460,70)
103         textZ.Location <- new Point(460,100)
104         textLR.Location <- new Point(460,130)
105         textUD.Location <- new Point(460,160)
106         form.Controls.Add(textX)
107         form.Controls.Add(textY)
108         form.Controls.Add(textZ)
109         form.Controls.Add(textLR)
110         form.Controls.Add(textUD)
111         form.Controls.Add(labelX)
112         form.Controls.Add(labelY)
113         form.Controls.Add(labelZ)
114         form.Controls.Add(labelLR)
115         form.Controls.Add(labelUD)
116     override v.OnLoad e =
117         base.OnLoad e
118         GL.ClearColor Color.MidnightBlue
119         Application.Idle.Add(v.AIdle)
120         v.ShowUI        
121         textX.TextChanged.Add(form.TextChange)
122         textY.TextChanged.Add(form.TextChange)
123         textZ.TextChanged.Add(form.TextChange)
124         textLR.TextChanged.Add(form.TextChange)
125         textUD.TextChanged.Add(form.TextChange)
126         //踢除正反面
127         //GL.Enable EnableCap.CullFace
128         //GL.CullFace CullFaceMode.Back
129         //指定正反面
130         GL.FrontFace FrontFaceDirection.Ccw
131         //设置材料面填充模式
132         GL.PolygonMode(MaterialFace.Front,PolygonMode.Fill)
133         GL.PolygonMode(MaterialFace.Back,PolygonMode.Line)
134         //启用数组功能.
135         GL.EnableClientState(ArrayCap.VertexArray)
136         GL.EnableClientState(ArrayCap.ColorArray)
137     member v.resize (e:EventArgs) =
138         GL.Viewport(0,0,glControl.ClientSize.Width,glControl.ClientSize.Height)
139         let aspect = float32 glControl.ClientSize.Width /float32 glControl.ClientSize.Height
140         let mutable projection = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4,aspect,0.1f,64.f)
141         GL.MatrixMode MatrixMode.Projection
142         GL.LoadMatrix(&projection)
143     member v.paint (e:PaintEventArgs) =
144         v.Render()
145     member v.AIdle (e:EventArgs) =
146         while (glControl.IsIdle) do
147             v.Render()
148     member v.TextChange (e:EventArgs) =
149         x <- v.UIValue(textX)
150         y <- v.UIValue(textY)
151         z <- v.UIValue(textZ)
152     member v.MouseDown(e:MouseEventArgs) =
153         match v.ActiveControl with
154         | :? TextBox as t1 -> 
155             let mutable t = v.UIValue(t1)
156             t <- t + float32 e.Delta * offest * 0.01f
157             t1.Text <- t.ToString()
158         | _ -> 
159             v.Text <- v.ActiveControl.Text
160             let state =float32 e.Delta * offest * 0.01f
161             z <- z + state
162         v.ShowUI
163     member x.UIValue
164         with get (text:TextBox) = 
165             let mutable value = 0.f
166             if System.Single.TryParse(text.Text,&value) then
167                 value <- value
168             value
169         and set (text:TextBox) (value:float32) = text.Text<- value.ToString()
170     member v.ShowUI =
171         textX.Text <- x.ToString()
172         textY.Text <- y.ToString()
173         textZ.Text <- z.ToString()
174         textLR.Text <- v.UIValue(textLR).ToString()
175         textUD.Text <- v.UIValue(textUD).ToString()
176        //lControl.Focus() |> ignore        
177     member v.Render =
178        // v.ShowUI        
179         let mutable lookat = Matrix4.LookAt(new Vector3(x,y,z),Vector3.Zero,Vector3.UnitY)
180         GL.MatrixMode(MatrixMode.Modelview)
181         GL.LoadMatrix(&lookat)
182         GL.Translate(1.f,1.f,1.f)
183         GL.Rotate(v.UIValue(textLR),0.f,1.f,0.f)
184         GL.Rotate(v.UIValue(textUD),1.f,0.f,0.f)
185         GL.Clear(ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit)
186         GL.Color3(1.f,1.f,0.f)
187         GL.PointSize(10.f)
188         GL.Begin BeginMode.Points
189         GL.Vertex3(x-1.f,y-1.f,0.f)
190         GL.Vertex3(0.f,2.f,0.f)
191         GL.End()
192         GL.Begin BeginMode.Lines
193         GL.Vertex3(x,y,-200.f)
194         GL.Vertex3(x,y,200.f)
195         GL.End()
196         GL.Color3(Color.Black)
197         //GL.DrawArrays(BeginMode.Quads,0,cArray.Length)
198 //        GL.Begin BeginMode.Quads
199 //        GL.ArrayElement(0)
200 //        GL.ArrayElement(1)
201 //        GL.ArrayElement(2)
202 //        GL.ArrayElement(3)
203 //        GL.End()      
204         GL.VertexPointer(3,VertexPointerType.Float,0,aArray)  
205         GL.ColorPointer(3,ColorPointerType.Float,0,cArray) 
206         GL.IndexPointer(IndexPointerType.Int,0,iArray)
207         //GL.DrawElements(BeginMode.Quads,4, DrawElementsType.UnsignedInt, [|0u;1u;2u;3u|])
208         //GL.DrawElements(BeginMode.Quads,4, DrawElementsType.UnsignedInt, [|4u;5u;6u;7u|])
209         GL.DrawElements(BeginMode.Quads,iArray.Length,DrawElementsType.UnsignedInt,iArray)
210         GL.Begin BeginMode.Lines
211         GL.Color3(Color.Black)
212         GL.Vertex3(Vector3.Zero)
213         GL.Vertex3(Vector3.UnitX * 1000.f)
214         GL.Color3(Color.White)
215         GL.Vertex3(Vector3.Zero)
216         GL.Vertex3(Vector3.UnitY * 1000.f)
217         GL.Color3(Color.Red)
218         GL.Vertex3(Vector3.Zero)
219         GL.Vertex3(Vector3.UnitZ * 1000.f)
220         GL.End()
221         glControl.SwapBuffers()
222         ignore
223 let t = new loopForm()
224 t.Show()   
225 
226 //        GL.Begin BeginMode.Quads
227 //        GL.Color3(Color.Black)
228 //        GL.Vertex3(1.f,1.f,1.f)
229 //        GL.Vertex3(-1.f,1.f,1.f)
230 //        GL.Vertex3(-1.f,-1.f,1.f)
231 //        GL.Vertex3(1.f,-1.f,1.f)
232 //
233 //        GL.Color3(Color.White)
234 //        GL.Vertex3(1.f,1.f,-1.f)
235 //        GL.Vertex3(1.f,1.f,1.f)
236 //        GL.Vertex3(1.f,-1.f,1.f)
237 //        GL.Vertex3(1.f,-1.f,-1.f)
238 //
239 //        GL.Color3(Color.Red)
240 //        GL.Vertex3(1.f,1.f,-1.f)
241 //        GL.Vertex3(-1.f,1.f,-1.f)
242 //        GL.Vertex3(-1.f,1.f,1.f)
243 //        GL.Vertex3(1.f,1.f,1.f)
244 //
245 //        GL.Color3(0.f,1.f,0.f)
246 //        GL.Vertex3(-1.f,1.f,-1.f)
247 //        GL.Vertex3(1.f,1.f,-1.f)
248 //        GL.Vertex3(1.f,-1.f,-1.f)
249 //        GL.Vertex3(-1.f,-1.f,-1.f)
250 //        GL.End()  
View Code

 9.OpenTK里的光照.

  1 #r "D:\Program Files\openTK\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
  2 #r "D:\Program Files\openTK\1.0\Binaries\OpenTK\Debug\OpenTK.Compatibility.dll"
  3 #r "D:\Program Files\openTK\1.0\Binaries\OpenTK\Debug\OpenTK.GLControl.dll"
  4 
  5 open System
  6 open System.Collections.Generic
  7 open System.Windows.Forms
  8 open System.Threading
  9 open System.Drawing
 10 open System.Drawing.Imaging
 11 open OpenTK
 12 open OpenTK.Graphics
 13 open OpenTK.Graphics.OpenGL
 14 
 15 type loopForm() as form=
 16     inherit Form()
 17     let mutable x = 10.f
 18     let mutable y = 10.f
 19     let mutable z = 10.f
 20     let offest = 1.f
 21     let glControl = new OpenTK.GLControl()
 22     let textX= new TextBox()
 23     let textY= new TextBox()
 24     let textZ= new TextBox()
 25     let textLR = new TextBox()
 26     let textUD= new TextBox()
 27     let textInfo = new TextBox()
 28     let labelX= new Label()
 29     let labelY= new Label()
 30     let labelZ= new Label()
 31     let labelLR = new Label()
 32     let labelUD= new Label()
 33     let mutable first = 0
 34     let mutable buffer = 0
 35     let list = 0
 36     let scale = 3.f
 37     let mutable r = 0.f
 38     let q = Glu.NewQuadric()
 39     let mutable ll = [|7.f;7.f;0.f;1.f|]
 40     do
 41         form.SuspendLayout()
 42         glControl.Location <- new Point(10,40)
 43         glControl.Size <- new Size(400,300)
 44         glControl.BackColor <- Color.Red
 45         glControl.Resize.Add(form.resize)
 46         glControl.Paint.Add(form.paint)
 47         form.MouseWheel.Add(form.MouseDown)
 48         form.ClientSize <- new Size(600,400)
 49         form.Text <- "opengl"
 50         form.StartPosition <- FormStartPosition.Manual
 51         form.Location <- new Point(100,200)
 52         form.Controls.Add(glControl)
 53         form.ResumeLayout(false)
 54         labelX.Location <- new Point(420,40)
 55         labelY.Location <- new Point(420,70)
 56         labelZ.Location <- new Point(420,100)
 57         labelLR.Location <- new Point(420,130)
 58         labelUD.Location <- new Point(420,160)
 59         labelX.Text <- "X:"
 60         labelY.Text <- "Y:"
 61         labelZ.Text <- "Z:"
 62         labelLR.Text  <- "水平:"
 63         labelUD.Text <-"上下:"
 64         textX.Location <- new Point(460,40)
 65         textY.Location <- new Point(460,70)
 66         textZ.Location <- new Point(460,100)
 67         textLR.Location <- new Point(460,130)
 68         textUD.Location <- new Point(460,160)
 69         textInfo.Text <- "3"
 70         textInfo.Location <- new Point(420,190)
 71         textInfo.Width <- 140
 72         form.Controls.Add(textX)
 73         form.Controls.Add(textY)
 74         form.Controls.Add(textZ)
 75         form.Controls.Add(textLR)
 76         form.Controls.Add(textUD)
 77         form.Controls.Add(labelX)
 78         form.Controls.Add(labelY)
 79         form.Controls.Add(labelZ)
 80         form.Controls.Add(labelLR)
 81         form.Controls.Add(labelUD)
 82         form.Controls.Add(textInfo)
 83         //#endregion 
 84     override v.OnLoad e =
 85         base.OnLoad e
 86         GL.ClearColor Color.MidnightBlue
 87         Application.Idle.Add(v.AIdle)
 88         v.ShowUI        
 89         textX.TextChanged.Add(form.TextChange)
 90         textY.TextChanged.Add(form.TextChange)
 91         textZ.TextChanged.Add(form.TextChange)
 92         textLR.TextChanged.Add(form.TextChange)
 93         textUD.TextChanged.Add(form.TextChange)
 94         GL.FrontFace FrontFaceDirection.Ccw
 95         //设置材料面填充模式
 96         GL.PolygonMode(MaterialFace.Front,PolygonMode.Fill)
 97         GL.PolygonMode(MaterialFace.Back,PolygonMode.Line)
 98         //启用数组功能.
 99         GL.EnableClientState(ArrayCap.VertexArray)
100         //GL.EnableClientState(ArrayCap.ColorArray)
101         GL.EnableClientState(ArrayCap.IndexArray)
102         GL.Light(LightName.Light0,LightParameter.Ambient,[|0.f;1.f;1.f;1.f|])
103         GL.Light(LightName.Light0,LightParameter.Diffuse,[|1.f;0.f;1.f;1.f|])
104         GL.Light(LightName.Light0,LightParameter.Specular,[|0.f;0.f;1.f;1.f|])
105         GL.Light(LightName.Light0,LightParameter.SpotDirection,[|-1.f;-1.f;0.f|])
106         GL.Light(LightName.Light0,LightParameter.SpotCutoff,[|60|])
107 
108         GL.Light(LightName.Light1,LightParameter.Position,[|20.f;20.f;20.f;0.f|])         
109         GL.Light(LightName.Light1,LightParameter.Ambient,[|0.5f;0.5f;0.5f;1.f|])
110         GL.Light(LightName.Light1,LightParameter.Diffuse,[|0.5f;0.5f;0.5f;1.f|])
111         GL.Light(LightName.Light1,LightParameter.Specular,[|1.f;1.f;1.f;1.f|])
112         //GL.Light(LightName.Light0,LightParameter.Specular,[|1.f;0.f;1.f;1.f|])
113         //GL.Material(MaterialFace.Front,MaterialParameter.Ambient,[|1.f;1.f;1.f;1.f|])
114         GL.Enable(EnableCap.Lighting)
115         GL.Enable(EnableCap.Light0)
116         GL.Enable(EnableCap.Light1)
117         GL.Enable(EnableCap.DepthTest)
118 //#region ""
119     member v.resize (e:EventArgs) =
120         GL.Viewport(0,0,glControl.ClientSize.Width,glControl.ClientSize.Height)
121         let aspect = float32 glControl.ClientSize.Width /float32 glControl.ClientSize.Height
122         let mutable projection = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4,aspect,0.1f,64.f)
123         GL.MatrixMode MatrixMode.Projection
124         GL.LoadMatrix(&projection)
125     member v.paint (e:PaintEventArgs) =
126         v.Render()
127     member v.AIdle (e:EventArgs) =
128         while (glControl.IsIdle) do
129             v.Render()
130     member v.TextChange (e:EventArgs) =
131         x <- v.UIValue(textX)
132         y <- v.UIValue(textY)
133         z <- v.UIValue(textZ)
134     member v.MouseDown(e:MouseEventArgs) =
135         match v.ActiveControl with
136         | :? TextBox as t1 -> 
137             let mutable t = v.UIValue(t1)
138             t <- t + float32 e.Delta * offest * 0.01f
139             t1.Text <- t.ToString()
140         | _ -> 
141             v.Text <- v.ActiveControl.Text
142             let state =float32 e.Delta * offest * 0.01f
143             x<- x+state
144             y<- y + state
145             z <- z + state
146         v.ShowUI
147     member x.UIValue
148         with get (text:TextBox) = 
149             let mutable value = 0.f
150             if System.Single.TryParse(text.Text,&value) then
151                 value <- value
152             value
153         and set (text:TextBox) (value:float32) = text.Text<- value.ToString()
154     member v.ShowUI =
155         textX.Text <- x.ToString()
156         textY.Text <- y.ToString()
157         textZ.Text <- z.ToString()
158         textLR.Text <- v.UIValue(textLR).ToString()
159         textUD.Text <- v.UIValue(textUD).ToString()
160     member v.Render =
161         let mutable lookat = Matrix4.LookAt(new Vector3(x,y,z),Vector3.Zero,Vector3.UnitY)
162         GL.MatrixMode(MatrixMode.Modelview)
163         GL.LoadMatrix(&lookat)        
164         GL.Rotate(v.UIValue(textLR),0.f,1.f,0.f)
165         GL.Rotate(v.UIValue(textUD),1.f,0.f,0.f)
166         GL.Clear(ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit)
167         GL.Begin BeginMode.Lines
168         GL.Color3(Color.Black)
169         GL.Vertex3(Vector3.Zero)
170         GL.Vertex3(Vector3.UnitX * 1000.f)
171         GL.Color3(Color.White)
172         GL.Vertex3(Vector3.Zero)
173         GL.Vertex3(Vector3.UnitY * 1000.f)
174         GL.Color3(Color.Red)
175         GL.Vertex3(Vector3.Zero)
176         GL.Vertex3(Vector3.UnitZ * 1000.f)
177         GL.End()
178         r <- (r + 0.01f) % 360.f
179         textInfo.Text <- r.ToString()
180         GL.PushMatrix()
181         GL.Rotate(r,0.f,1.f,0.f)
182         GL.Light(LightName.Light0,LightParameter.Position,ll) 
183         GL.PushMatrix()
184         GL.Translate(ll.[0],ll.[1],ll.[2])
185         Glu.Sphere(q,1.0,20,20)
186         GL.PopMatrix()
187         GL.PopMatrix()
188         Glu.Sphere(q,3.0,20,20)
189         glControl.SwapBuffers()
190         ignore
191 let t = new loopForm()
192 t.Show()
View Code

 10.相关画圆,画立方体类.

  1 #r "D:\工程\OpenTK\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
  2 #r "D:\工程\OpenTK\1.0\Binaries\OpenTK\Debug\OpenTK.Compatibility.dll"
  3 #r "D:\工程\OpenTK\1.0\Binaries\OpenTK\Debug\OpenTK.GLControl.dll"
  4 
  5 open System
  6 open System.Collections.Generic
  7 open System.Windows.Forms
  8 open System.Threading
  9 open System.Drawing
 10 open System.Drawing.Imaging
 11 open OpenTK
 12 open OpenTK.Graphics
 13 open OpenTK.Graphics.OpenGL
 14 
 15 module Shape =
 16 
 17     type T2N3V3 =
 18         struct
 19             val mutable TexCoord : Vector2
 20             val mutable Normal : Vector3
 21             val mutable Position : Vector3
 22             new(v,n,p) = {TexCoord = v;Normal = n;Position = p}
 23         end
 24     [<AbstractClass>]
 25     type Shape() =
 26         let mutable bCreate = false
 27         let mutable vi = 0
 28         let mutable ei = 0
 29         let mutable count = 0
 30         member this.vboID with get() = vi and set value = vi <- value
 31         member this.eboID with get() = ei and set value = ei <- value
 32         member this.TriangelCount with get() = count and set value = count <- value
 33         member this.IsCreate with get() = bCreate and set value = bCreate <- value
 34         abstract Draw : unit -> unit
 35         abstract Init : unit -> unit
 36         member this.InitQ : unit -> unit =fun () -> ()
 37 
 38     type Sphere(radius:float32,level:int) =
 39         inherit Shape()
 40         let mutable rad,lev = radius,level
 41         let RightLevel = 
 42             if lev < 0 then lev <- 0
 43             elif lev > 6 then lev <-6
 44         override this.Draw() =  
 45             if this.IsCreate<>true then this.Init()
 46             GL.BindBuffer(BufferTarget.ArrayBuffer,this.vboID)
 47             GL.BindBuffer(BufferTarget.ElementArrayBuffer,this.eboID)
 48             GL.InterleavedArrays(InterleavedArrayFormat.T2fN3fV3f,0,IntPtr.Zero)
 49             GL.DrawElements(BeginMode.Triangles,this.TriangelCount,DrawElementsType.UnsignedInt,IntPtr.Zero)
 50         override this.Init() =
 51             let alls = Array.create 6 (new T2N3V3())
 52             alls.[0] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), Vector3.UnitX, Vector3.UnitX * rad )
 53             alls.[1] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), Vector3.UnitY, Vector3.UnitY * rad )
 54             alls.[2] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), Vector3.UnitZ, Vector3.UnitZ * rad )
 55             alls.[3] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), -Vector3.UnitX, -Vector3.UnitX * rad )
 56             alls.[4] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), -Vector3.UnitY, -Vector3.UnitY * rad )
 57             alls.[5] <- new T2N3V3(new Vector2( 0.0f, 0.0f ), -Vector3.UnitZ, -Vector3.UnitZ * rad )
 58             let is = [| 
 59                             1;2;0
 60                             0;2;4
 61                             0;4;5
 62                             5;1;0
 63                             1;3;2
 64                             4;2;3
 65                             4;3;5
 66                             1;5;3
 67                         |]
 68             let (vvv:T2N3V3 []),(iv: int[]) = this.Sub (alls,is)
 69             let mutable vID,eID = 0,0
 70             //let mutable tv,vv,pv = vvv |> Array.map (fun v -> v.TexCoord,v.Normal,v.Position) |> Array.unzip3            
 71             GL.GenBuffers(1,&vID) 
 72             GL.BindBuffer(BufferTarget.ArrayBuffer,vID)
 73             GL.BufferData(BufferTarget.ArrayBuffer,IntPtr (4 * 8 * vvv.Length),vvv,BufferUsageHint.StaticDraw)
 74             
 75             GL.GenBuffers(1,&eID)
 76             GL.BindBuffer(BufferTarget.ElementArrayBuffer,eID)
 77             GL.BufferData(BufferTarget.ElementArrayBuffer,IntPtr (4 * iv.Length),iv,BufferUsageHint.StaticDraw)
 78 
 79             this.vboID <- vID
 80             this.eboID <- eID
 81             this.TriangelCount <- iv.Length 
 82             this.IsCreate <- true
 83             ()
 84          member v.GetMidValue (first:T2N3V3,second:T2N3V3) =
 85             let midN = Vector3.Lerp(first.Position,second.Position,0.5f) |> Vector3.Normalize
 86             let midP = midN *(float32 rad)
 87             let midT = Vector2.Lerp(first.TexCoord,second.TexCoord,0.5f) |> Vector2.Normalize
 88             let result = new T2N3V3(midT,midN,midP)
 89             result
 90         member v.Subdivide (v1:T2N3V3,v2:T2N3V3,v3:T2N3V3) =
 91             let vs = Array.create 6 (new T2N3V3())
 92             vs.[0] <- v1
 93             vs.[1] <- v.GetMidValue(v1,v2)
 94             vs.[2] <- v.GetMidValue(v3,v1)
 95             vs.[3] <- v2
 96             vs.[4] <- v.GetMidValue(v2,v3)
 97             vs.[5] <- v3
 98             let is = Array.create 12 0
 99             is.[0] <- 0
100             is.[1] <- 1
101             is.[2] <- 2
102             is.[3] <- 2
103             is.[4] <- 1
104             is.[5] <- 4
105             is.[6] <- 4
106             is.[7] <- 1
107             is.[8] <- 3
108             is.[9] <- 2
109             is.[10] <-4
110             is.[11] <- 5
111             (vs,is)
112         member this.Sub(alls:T2N3V3 [],is:int []) =
113             //let mutable tv,vv,pv = alls |> Array.map (fun v -> v.TexCoord,v.Normal,v.Position) |> Array.unzip3
114             let mutable allv = alls
115             let mutable iv = is
116             let show array = printfn "%A" array
117             for j in 0 .. lev do
118                 let mutable av = Array.create 0 (new T2N3V3())
119                 let mutable ev = Array.create 0 0
120                 printfn "%i" allv.Length
121                 printfn "%i" iv.Length
122                 for i in 0 .. 3 .. iv.Length - 1 do
123                     let (vvv,iiv) = this.Subdivide(allv.[iv.[i]],allv.[iv.[i+1]],allv.[iv.[i+2]])
124                     let length = av.Length
125                     av <- Array.append av vvv
126                     let map = iiv |> Array.map (fun p -> p + length)
127                     ev <- Array.append ev map
128                 allv <- av
129                 iv <- ev 
130                 allv |> Array.map (fun p -> p.Position) |> show
131                 show iv
132             allv,iv
133 
134     type Cube(width:float32,height:float32,length:float32,index:int) =
135         inherit Shape()
136         let mutable id = index
137         let xl,yl,zl =width/2.f,height/2.f,length/2.f
138         let mutable color = Color.White
139         let v8 = [|
140                         new Vector3(xl,yl,zl)
141                         new Vector3(-xl,yl,zl)
142                         new Vector3(-xl,-yl,zl)
143                         new Vector3(xl,-yl,zl)
144                         new Vector3(xl,yl,-zl)
145                         new Vector3(-xl,yl,-zl)
146                         new Vector3(-xl,-yl,-zl)
147                         new Vector3(xl,-yl,-zl)
148                     |]
149         new(x,y,z) =
150             let rnd = System.Random().Next()
151             printfn "%i" rnd
152             Cube(x,y,z,-1)
153         override this.Draw() = 
154             if this.IsCreate<>true then this.Init()
155             GL.EnableClientState(ArrayCap.VertexArray)
156             GL.EnableClientState(ArrayCap.NormalArray)
157             GL.BindBuffer(BufferTarget.ArrayBuffer,this.vboID)
158             GL.VertexPointer(3,VertexPointerType.Float,0,IntPtr.Zero)
159             GL.PushMatrix()
160             if id >= 0 && id < 8 then
161                 GL.Translate(v8.[id])
162             GL.Color3(this.Color:Color)
163             GL.Normal3(Vector3.UnitZ)
164             GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|0;1;2;0;2;3|])
165             //GL.Color3(Color.Black)
166             GL.Normal3(Vector3.UnitY)
167             GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|4;5;1;4;1;0|])
168             //GL.Color3(Color.Red)
169             GL.Normal3(Vector3.UnitX)
170             GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|4;0;3;4;3;7|])
171             //GL.Color3(Color.Green)
172             GL.Normal3(-Vector3.UnitY)
173             GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|3;2;6;3;6;7|])
174             //GL.Color3(Color.Blue)
175             GL.Normal3(-Vector3.UnitX)
176             GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|1;5;6;1;6;2|])
177             //GL.Color3(Color.DodgerBlue)
178             GL.Normal3(-Vector3.UnitZ)
179             GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,[|5;4;7;5;7;6|])
180             GL.PopMatrix()
181         override this.Init() =
182             let mutable vID = 0
183             GL.GenBuffers(1,&vID) 
184             GL.BindBuffer(BufferTarget.ArrayBuffer,vID)
185             GL.BufferData(BufferTarget.ArrayBuffer,IntPtr (4 * 3 * v8.Length),v8,BufferUsageHint.StaticDraw)
186             this.vboID <- vID
187             this.IsCreate <- true    
188             let rnd = System.Random(this.GetHashCode())
189             this.Color <- Color.FromArgb(rnd.Next(0,255),rnd.Next(0,255),rnd.Next(0,255))
190             ()
191         member this.Index with get() = id and set value = id <-value
192         member this.Color with get() = color and set value = color <- value
193 
194     type Camera() = 
195         let mutable eye = Vector3.Zero
196         let mutable eyeLength = 10.
197         let mutable yangle = 0.
198         let mutable xangle= Math.PI/2.
199         member this.Eye 
200             with get() = eye 
201             and set value = eye <- value
202         member this.EyeLength 
203             with get() = eyeLength 
204             and set value = 
205                 if value < 0. then eyeLength <- 0.1
206                 eyeLength <- value
207         member this.YAngle 
208             with get() = yangle
209             and set value = 
210                 if value >= Math.PI then yangle <- 0.
211                 //elif value <= 0. then yangle <- Math.PI - 0.1
212                 else yangle <- value
213         member this.XAngle 
214             with get() = xangle
215             and set value = 
216                 if value >= 2.* Math.PI then xangle <- 0.
217                 //elif value <= 0. then yangle <- 2. * Math.PI - 0.1
218                 else xangle <- value
219         member this.Target 
220             with get() = 
221                 //printfn "%f" this.XAngle 
222                 let x:float =float eye.X + eyeLength * Math.Cos(this.YAngle)* Math.Cos(this.XAngle)
223                 let y:float =float eye.Y + eyeLength * Math.Sin(this.YAngle)
224                 let z:float =float eye.Z + eyeLength * Math.Cos(this.YAngle)* Math.Sin(this.XAngle)
225                 Vector3(float32 x,float32 y,float32 z)
226         member this.Transelt (x,y,z) = 
227             let sinX = Math.Sin(this.XAngle)
228             let cosX = Math.Cos(this.XAngle)
229             let x1 = float this.Eye.X + x * sinX + z * cosX
230             let y1 = float this.Eye.Y + y
231             let z1 = float this.Eye.Z + z * sinX + x * cosX
232             printfn "angle:%f, sinx:%f, cosx:%f" x y z
233             printfn "x:%f, y:%f, z:%f" this.Eye.X this.Eye.Y this.Eye.Z
234             this.Eye <- new Vector3(float32 x1,float32 y1,float32 z1)
235         member this.UpAndDown y =
236             let ya = this.YAngle + y
237             this.YAngle <- ya
238         member this.RightAndLeft x =
239             let xa = this.XAngle + x
240             this.XAngle <- xa
241         member this.Rotate (x,y) =
242             let xa = this.XAngle + x
243             let ya = this.YAngle + y
244             this.YAngle <- ya
245             this.XAngle <- xa
View Code

11...

  1 #r "D:\工程\OpenTK\1.0\Binaries\OpenTK\Debug\OpenTK.dll"
  2 #r "D:\工程\OpenTK\1.0\Binaries\OpenTK\Debug\OpenTK.GLControl.dll"
  3 #load "Shape.fsx"
  4 
  5 open System
  6 open System.Collections.Generic
  7 open System.Windows.Forms
  8 open System.Threading
  9 open System.Drawing
 10 open System.Drawing.Imaging
 11 open OpenTK
 12 open OpenTK.Graphics
 13 open OpenTK.Graphics.OpenGL
 14 open Shape
 15 
 16 type loopForm() as form=
 17     inherit Form()
 18     let caram = Shape.Camera()
 19     let offest = 0.1f
 20     let offestd = float offest
 21     let glControl = new OpenTK.GLControl()
 22 
 23     let cubeEnter = Shape.Cube(1.5f,0.2f,1.8f,3)
 24     let cubeParlor = Shape.Cube(4.9f,0.2f,6.3f,3)
 25     let cubeBalcony1 = Shape.Cube(4.9f,0.2f,1.9f,3)
 26     let cubeBalcony2 = Shape.Cube(1.6f,0.2f,2.1f,3)
 27     let cubeBalcony3 = Shape.Cube(1.8f,0.2f,3.0f,3)
 28     let cubeKitchen = Shape.Cube(4.5f,0.2f,1.8f,3)
 29     let cubeBathroom = Shape.Cube(2.1f,0.2f,2.1f,3)
 30     let cubeGallery = Shape.Cube(2.1f,0.2f,1.2f,3)
 31     let cubeMasterBedroom = Shape.Cube(3.6f,0.2f,3.9f,3)
 32     let cubeSecondbedroom = Shape.Cube(3.0f,0.2f,3.3f,3)
 33 
 34     let cubeWall1 = Shape.Cube(0.2f,3.f,8.1f,0)
 35     let cubeWall2 = Shape.Cube(4.5f,3.f,0.2f,0)
 36     let cubeWall3 = Shape.Cube(0.2f,3.f,1.8f,0)
 37     let cubeWall4 = Shape.Cube(0.2f,1.8f,1.8f,0)
 38     let cubeWall5 = Shape.Cube(3.0f,3.f,0.2f,0)
 39     let cubeWall6 = Shape.Cube(0.2f,3.f,3.7f,0)
 40     let cubeBathroom1 = Shape.Cube(2.1f,3.f,0.2f,0)
 41     let cubeBathroom2 = Shape.Cube(0.2f,3.f,2.1f,0)
 42     let cubeFence1 = Shape.Cube(0.05f,0.02f,1.9f,0)
 43     let cubeFence2 = Shape.Cube(2.3f,0.02f,0.05f,0)
 44     let cubeFence3 = Shape.Cube(0.05f,0.02f,2.1f,0)
 45     let cubeFence4 = Shape.Cube(3.4f,0.02f,0.05f,0)
 46     let cubeWall7 = Shape.Cube(2.1f,3.f,0.2f,4)
 47     let cubeWall8 = Shape.Cube(0.2f,3.f,3.0f,0)
 48     let cubePillar = Shape.Cube(0.2f,3.f,0.2f,4)
 49     let cubePillar2 = Shape.Cube(0.1f,1.1f,0.2f,4)
 50     let mutable oldMouseLocation = Vector2.Zero
 51     let path = [|
 52                    "D:\工程\OpenTK\1.0\ConsoleApplication1\白墙.jpg"
 53                    "D:\工程\OpenTK\1.0\ConsoleApplication1\电视墙.jpg"
 54                    "D:\工程\OpenTK\1.0\ConsoleApplication1\客厅.jpg"
 55                |]
 56     let mutable texs = Array.create path.Length 0 
 57     do
 58         caram.Transelt(1.,1.7,0.0)
 59         form.SuspendLayout()
 60         glControl.Location <- new Point(10,40)
 61         glControl.Size <- new Size(400,300)
 62         glControl.BackColor <- Color.Red
 63         glControl.Resize.Add(form.resize)
 64         glControl.Paint.Add(form.paint)
 65         glControl.KeyDown.Add(form.KeyDown)
 66         glControl.MouseMove.Add(form.MouseDownv)
 67         form.ClientSize <- new Size(450,350)
 68         form.Text <- "opengl"
 69         //form.StartPosition <- FormStartPosition.Manual
 70         form.Location <- new Point(1200,600)
 71         form.Controls.Add(glControl)
 72         form.ResumeLayout(false)
 73         //#endregion 
 74     override v.OnLoad e =
 75         base.OnLoad e
 76         GL.ClearColor Color.MidnightBlue
 77         Application.Idle.Add(v.AIdle)
 78         GL.FrontFace FrontFaceDirection.Ccw
 79         GL.Enable( EnableCap.PointSmooth )
 80         GL.Enable EnableCap.Texture2D
 81         //GL.Enable EnableCap.Lighting
 82         //踢除正反面
 83         GL.Enable EnableCap.CullFace
 84         GL.CullFace CullFaceMode.Back
 85         //设置材料面填充模式
 86         GL.PolygonMode(MaterialFace.Front,PolygonMode.Fill)
 87         GL.PolygonMode(MaterialFace.Back,PolygonMode.Line)
 88         texs <- Shape.TexTure.Load(path)
 89         GL.Light(LightName.Light0,LightParameter.Position,[|20.f;20.f;20.f;0.f|])         
 90         GL.Light(LightName.Light0,LightParameter.Ambient,[|0.5f;0.5f;0.5f;1.f|])
 91         GL.Light(LightName.Light0,LightParameter.Diffuse,[|0.5f;0.5f;0.5f;1.f|])
 92         GL.Light(LightName.Light0,LightParameter.Specular,[|1.f;1.f;1.f;1.f|])
 93         GL.Enable(EnableCap.Lighting)
 94         //GL.Enable(EnableCap.Light0)
 95         GL.Enable(EnableCap.DepthTest)
 96 
 97 //#region
 98     member v.resize (e:EventArgs) =
 99         GL.Viewport(0,0,glControl.ClientSize.Width,glControl.ClientSize.Height)
100         let aspect = float32 glControl.ClientSize.Width /float32 glControl.ClientSize.Height
101         let mutable projection = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver2,aspect,0.1f,30.f)
102         GL.MatrixMode MatrixMode.Projection
103         GL.LoadMatrix(&projection)
104     member v.paint (e:PaintEventArgs) =
105         v.Render()
106     member v.AIdle (e:EventArgs) =
107         while (glControl.IsIdle) do
108             v.Render()
109     member v.MouseDownv(e:MouseEventArgs) =
110         if e.Button = MouseButtons.Right then
111             if oldMouseLocation = Vector2.Zero then
112                 oldMouseLocation <- Vector2(float32 e.X,float32 e.Y)
113             else
114                 let nx = (float32 e.X - oldMouseLocation.X) * offest * 0.1f
115                 let ny = (float32 e.Y - oldMouseLocation.Y) * offest * -0.1f
116                 caram.Rotate(float nx,float ny)
117         oldMouseLocation <- Vector2(float32 e.X,float32 e.Y)     
118     member v.KeyDown(e:KeyEventArgs) =
119         //let keys = e.KeyData
120         match e.KeyCode with
121         | Keys.E ->caram.Transelt(0.,0.,1.* offestd)
122         | Keys.D ->caram.Transelt(0.,0.,-1.* offestd)
123         | Keys.S ->caram.Transelt(1.* offestd,0.,0.0)
124         | Keys.F ->caram.Transelt(-1.* offestd,0.,0.)
125         //| Keys.Space -> caram.Transelt()
126         | _ -> ()
127     member x.UIValue
128         with get (text:TextBox) = 
129             let mutable value = 0.f
130             if System.Single.TryParse(text.Text,&value) then
131                 value <- value
132             value
133         and set (text:TextBox) (value:float32) = text.Text<- value.ToString()
134 //#endregion        
135     member v.Render =
136         //Keyboard[OpenTK.Input.Key.F11]
137         GL.Clear(ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit)
138         //地面
139         //v.DrawCube(cubeEnter,Vector3.Zero)
140         v.DrawCube(cubeEnter,0.f,0.f,0.f,0,texs.[0])
141         v.DrawCube(cubeParlor,0.f,0.f,1.8f)
142         v.DrawCube(cubeBalcony1,0.f,0.f,8.1f)
143         v.DrawCube(cubeBalcony2,2.3f,0.f,10.f)
144         v.DrawCube(cubeBalcony3,3.9f,0.f,9.f)
145         v.DrawCube(cubeKitchen,1.5f,0.f,0.f)
146         v.DrawCube(cubeBathroom,3.9f,0.f,1.8f)
147         v.DrawCube(cubeGallery,3.9f,0.f,3.9f)
148         v.DrawCube(cubeMasterBedroom,3.9f,0.f,5.1f)
149         v.DrawCube(cubeSecondbedroom,6.0f,0.f,1.8f)  
150         //墙
151         v.DrawCube(cubeWall1,Vector3.Zero)
152         //v.DrawCube(cubeWall2,Vector3(1.5f,0.f,0.f))
153         v.DrawCube(cubeWall2,1.5f,0.f,0.f,0,texs.[2])
154         v.DrawCube(cubeWall3,Vector3(1.5f,0.f,0.f))
155         v.DrawCube(cubeWall4,Vector3(6.0f,0.f,0.f))
156         v.DrawCube(cubeWall5,Vector3(6.0f,0.f,1.8f))
157         v.DrawCube(cubeWall6,Vector3(9.0f,0.f,1.8f))
158         v.DrawCube(cubeWall6,Vector3(7.5f,0.f,5.1f))
159         v.DrawCube(cubeWall6,Vector3(3.9f,0.f,5.1f))        
160         v.DrawCube(cubeWall7,Vector3(3.9f,0.f,9.0f))
161         v.DrawCube(cubeWall8,Vector3(6.0f,0.f,9.0f))
162         v.DrawCube(cubeBathroom1,Vector3(3.9f,0.f,1.8f))
163         //v.DrawCube(cubeBathroom1,Vector3(3.9f,0.f,3.9f))
164         v.DrawCube(cubeBathroom2,Vector3(3.9f,0.f,1.8f))
165         v.DrawCube(cubeBathroom2,Vector3(6.0f,0.f,1.8f))
166         v.DrawCube(cubeFence1,0.0f,1.f,8.1f)  
167         v.DrawCube(cubeFence2,0.0f,1.f,10.f)  
168         v.DrawCube(cubeFence3,2.3f,1.f,10.f)  
169         v.DrawCube(cubeFence4,2.3f,1.f,12.1f)  
170         v.DrawCube(cubePillar,Vector3(2.3f,0.f,12.f))
171         v.DrawCube(cubePillar,Vector3(2.3f,0.f,9.9f))
172         v.DrawCube(cubePillar2,Vector3(0.f,0.f,9.9f))
173         //房顶
174         GL.PushMatrix()
175         GL.Translate(0.f,3.f,0.f)
176         v.DrawCube(cubeEnter,Vector3.Zero)
177         v.DrawCube(cubeParlor,0.f,0.f,1.8f)
178         v.DrawCube(cubeBalcony1,0.f,0.f,8.1f)
179         v.DrawCube(cubeBalcony2,2.3f,0.f,10.f)
180         v.DrawCube(cubeBalcony3,3.9f,0.f,9.f)
181         v.DrawCube(cubeKitchen,1.5f,0.f,0.f)
182         v.DrawCube(cubeBathroom,3.9f,0.f,1.8f)
183         v.DrawCube(cubeGallery,3.9f,0.f,3.9f)
184         v.DrawCube(cubeMasterBedroom,3.9f,0.f,5.1f)
185         v.DrawCube(cubeSecondbedroom,6.0f,0.f,1.8f)   
186         GL.PopMatrix()             
187         let mutable lookat = Matrix4.LookAt(caram.Eye,caram.Target,Vector3.UnitY)
188         GL.MatrixMode(MatrixMode.Modelview)
189         GL.LoadMatrix(&lookat)  
190         glControl.SwapBuffers()
191         ignore
192     member v.DrawCube(cube:Shape.Cube,pos:Vector3) =
193         v.DrawCube(cube,pos,cube.Index)
194     member v.DrawCube(cube:Shape.Cube,x,y,z) =
195         v.DrawCube(cube,new Vector3(x,y,z),cube.Index)
196     member v.DrawCube(cube:Shape.Cube,x,y,z,ind) =
197         v.DrawCube(cube,new Vector3(x,y,z),ind)
198     member v.DrawCube(cube:Shape.Cube, pos:Vector3, ind:int) =
199         GL.PushMatrix()
200         cube.Index <- ind
201         GL.Translate(pos)
202         cube.Draw()
203         GL.PopMatrix()
204     member v.DrawCube(cube:Shape.Cube,x,y,z,ind:int,tid:int) =
205         GL.PushMatrix()
206         GL.Translate(Vector3(x,y,z))
207         cube.DrawTexTure(ind,tid,Shape.TexTure.GenTexture)
208         GL.PopMatrix()
209 let t = new loopForm()
210 t.Show()
211             GL.Enable(EnableCap.TextureGenS)
212             GL.Enable(EnableCap.TextureGenT)
213             GL.TexGen(TextureCoordName.S,TextureGenParameter.TextureGenMode,int TextureGenMode.ObjectLinear)
214             GL.TexGen(TextureCoordName.T,TextureGenParameter.TextureGenMode,int TextureGenMode.ObjectLinear)
215             GL.TexGen(TextureCoordName.S,TextureGenParameter.ObjectPlane,[|1.f;0.f;0.f;0.f|])
216             GL.TexGen(TextureCoordName.T,TextureGenParameter.ObjectPlane,[|0.f;1.f;0.f;0.f|])
217          
View Code

 

type T
11136

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论