C# 拾取、平移、旋转对象。我该怎么做?
导言 我目前正在使用TAO框架在OpenGL中绘制图形。下面列出的是我使用纹理或颜色绘制任意大小的框的代码,用户可以指定。如下图所示,这在绘图时也能很好地工作 该项目是用VB.NET2010编写的,但由于大部分内容都是在C语言的帮助下编写的,所以我用两种语言发布它,因为答案可能是C语言,然后翻译成VB.NET 问题 现在,我尝试开发的下一部分是选择一个对象并旋转/平移它的能力。我不知道该怎么做。我在网上查过,只找到了C#中的示例,这些示例很好,但大多数方法都不能产生正确的结果。我知道我需要给我相信我已经做过的事情命名。所以我的问题是如何做到这一点 我也可以完全放弃我现有的代码来绘制所有东西。我不确定 现有计划 代码 以下是我的初始加载函数:C# 拾取、平移、旋转对象。我该怎么做?,c#,vb.net,opengl,tao-framework,C#,Vb.net,Opengl,Tao Framework,导言 我目前正在使用TAO框架在OpenGL中绘制图形。下面列出的是我使用纹理或颜色绘制任意大小的框的代码,用户可以指定。如下图所示,这在绘图时也能很好地工作 该项目是用VB.NET2010编写的,但由于大部分内容都是在C语言的帮助下编写的,所以我用两种语言发布它,因为答案可能是C语言,然后翻译成VB.NET 问题 现在,我尝试开发的下一部分是选择一个对象并旋转/平移它的能力。我不知道该怎么做。我在网上查过,只找到了C#中的示例,这些示例很好,但大多数方法都不能产生正确的结果。我知道我需要给我相
Private Sub DrawInit()
Gl.glClearColor(0.0F, 0.0F, 0.0F, 0.0F)
Gl.glShadeModel(Gl.GL_SMOOTH)
Gl.glClearDepth(1.0#)
Gl.glEnable(Gl.GL_DEPTH_TEST)
Gl.glDepthFunc(Gl.GL_LESS)
Gl.glEnable(Gl.GL_STENCIL_TEST)
Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST)
Draw_Shapes()
End Sub
我的绘图功能
Private Sub Draw_Shapes()
draw_boxes()
End Sub
我的绘图框函数
Private Sub draw_boxes()
Dim i As Integer = 0
Dim startx As Integer = 0
Dim starty As Integer = 0
Dim startz As Integer = 0
Dim deltax As Integer = 0
Dim deltay As Integer = 0
Dim deltaz As Integer = 0
Dim front_face_color As Color
Dim back_face_color As Color
Dim top_face_color As Color
Dim bottom_face_color As Color
Dim left_face_color As Color
Dim right_face_color As Color
Dim front_face_texture As Bitmap
Dim back_face_texture As Bitmap
Dim top_face_texture As Bitmap
Dim bottom_face_texture As Bitmap
Dim left_face_texture As Bitmap
Dim right_face_texture As Bitmap
Dim front_face_num_textures As Point
Dim back_face_num_textures As Point
Dim top_face_num_textures As Point
Dim bottom_face_num_textures As Point
Dim left_face_num_textures As Point
Dim right_face_num_textures As Point
Dim front_texture As Boolean
Dim back_texture As Boolean
Dim top_texture As Boolean
Dim bottom_texture As Boolean
Dim left_texture As Boolean
Dim right_texture As Boolean
Do Until i = boxes.Length - 1
startx = boxes(i).start_x
starty = boxes(i).start_y
startz = boxes(i).start_z
deltax = boxes(i).delta_x
deltay = boxes(i).delta_y
deltaz = boxes(i).delta_z
front_face_color = boxes(i).front_face_color
back_face_color = boxes(i).back_face_color
top_face_color = boxes(i).top_face_color
bottom_face_color = boxes(i).bottom_face_color
left_face_color = boxes(i).left_face_color
right_face_color = boxes(i).right_face_color
front_face_texture = boxes(i).front_face_texture
back_face_texture = boxes(i).back_face_texture
top_face_texture = boxes(i).top_face_texture
bottom_face_texture = boxes(i).bottom_face_texture
left_face_texture = boxes(i).left_face_texture
right_face_texture = boxes(i).right_face_texture
front_face_num_textures = boxes(i).front_face_num_textures
back_face_num_textures = boxes(i).back_face_num_textures
top_face_num_textures = boxes(i).top_face_num_textures
bottom_face_num_textures = boxes(i).bottom_face_num_textures
left_face_num_textures = boxes(i).left_face_num_textures
right_face_num_textures = boxes(i).right_face_num_textures
If front_face_texture Is Nothing Then
front_texture = False
Else
front_texture = True
End If
If back_face_texture Is Nothing Then
back_texture = False
Else
back_texture = True
End If
If top_face_texture Is Nothing Then
top_texture = False
Else
top_texture = True
End If
If bottom_face_texture Is Nothing Then
bottom_texture = False
Else
bottom_texture = True
End If
If left_face_texture Is Nothing Then
left_texture = False
Else
left_texture = True
End If
If right_face_texture Is Nothing Then
right_texture = False
Else
right_texture = True
End If
Gl.glLoadName(num_shapes)
Gl.glNewList(i + 1, Gl.GL_COMPILE)
draw_rectangular_face(front_texture, front_face_color, front_face_texture, New ThreeDPoint(startx, starty, startz), New ThreeDPoint(startx + deltax, starty, startz), New ThreeDPoint(startx + deltax, starty + deltay, startz), New ThreeDPoint(startx, starty + deltay, startz), front_face_num_textures)
draw_rectangular_face(back_texture, back_face_color, back_face_texture, New ThreeDPoint(startx, starty, startz), New ThreeDPoint(startx + deltax, starty, startz), New ThreeDPoint(startx + deltax, starty, startz + deltaz), New ThreeDPoint(startx, starty, startz + deltaz), back_face_num_textures)
draw_rectangular_face(top_texture, top_face_color, top_face_texture, New ThreeDPoint(startx, starty, startz + deltaz), New ThreeDPoint(startx + deltax, starty, startz + deltaz), New ThreeDPoint(startx + deltax, starty + deltay, startz + deltaz), New ThreeDPoint(startx, starty + deltay, startz + deltaz), top_face_num_textures)
draw_rectangular_face(bottom_texture, bottom_face_color, bottom_face_texture, New ThreeDPoint(startx, starty + deltay, startz), New ThreeDPoint(startx + deltax, starty + deltay, startz), New ThreeDPoint(startx + deltax, starty + deltay, startz + deltaz), New ThreeDPoint(startx, starty + deltay, startz + deltaz), bottom_face_num_textures)
draw_rectangular_face(left_texture, left_face_color, left_face_texture, New ThreeDPoint(startx + deltax, starty, startz), New ThreeDPoint(startx + deltax, starty + deltay, startz), New ThreeDPoint(startx + deltax, starty + deltay, startz + deltaz), New ThreeDPoint(startx + deltax, starty, startz + deltaz), left_face_num_textures)
draw_rectangular_face(right_texture, right_face_color, right_face_texture, New ThreeDPoint(startx, starty, startz), New ThreeDPoint(startx, starty + deltay, startz), New ThreeDPoint(startx, starty + deltay, startz + deltaz), New ThreeDPoint(startx, starty, startz + deltaz), right_face_num_textures)
Gl.glEndList()
num_shapes = num_shapes + 1
i = i + 1
Loop
我的画面功能
Private Sub draw_rectangular_face(ByVal texture As Boolean, ByVal face_color As Color, ByVal texture_image As Bitmap, ByVal point1 As ThreeDPoint, ByVal point2 As ThreeDPoint, ByVal point3 As ThreeDPoint, ByVal point4 As ThreeDPoint, ByVal num_textures As Point)
If texture = True Then
load_textures(texture_image)
End If
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 1)
If texture = True Then
Gl.glEnable(Gl.GL_TEXTURE_2D) 'turn on for texture
Else
Gl.glDisable(Gl.GL_TEXTURE_2D) 'turn on for color
End If
Gl.glBegin(Gl.GL_QUADS)
If texture = True Then
Gl.glColor3f(1, 1, 1) 'turn on for texture
Else
Gl.glColor3f(face_color.R / 256, face_color.G / 256, face_color.B / 256) 'turn on for color
End If
Gl.glTexCoord2f(0, 0) : Gl.glVertex3f(point1.x, point1.y, point1.z)
Gl.glTexCoord2f(num_textures.X, 0) : Gl.glVertex3f(point2.x, point2.y, point2.z)
Gl.glTexCoord2f(num_textures.X, num_textures.Y) : Gl.glVertex3f(point3.x, point3.y, point3.z)
Gl.glTexCoord2f(0, num_textures.Y) : Gl.glVertex3f(point4.x, point4.y, point4.z)
Gl.glEnd()
End Sub
用于平移和旋转世界的My DrawScene事件:
Private Sub DrawScene()
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT Or Gl.GL_DEPTH_BUFFER_BIT Or Gl.GL_STENCIL_BUFFER_BIT)
Gl.glLoadIdentity()
'move reference?
Gl.glTranslatef(camera_xloc, camera_yloc, camera_zloc)
' Gl.glTranslatef(0.0F, 0.0F, -20.0F)
'rotate
Gl.glRotatef(camera_xrot, 1, 0, 0)
Gl.glRotatef(camera_yrot, 0, 1, 0)
Gl.glRotatef(camera_zrot, 0, 0, 1)
Dim i As Integer = 1
Do Until i > num_shapes
Gl.glCallList(i)
i = i + 1
Loop
Gl.glFlush()
Application.DoEvents()
Gdi.SwapBuffers(hDC)
If intialload = 0 Then
intialload = 1
RaiseEvent initial_load_completed()
End If
End Sub
我尝试过将shape#1转换为10001000,但没有成功:
Gl.glLoadName(num_shapes)
Gl.glNewList(i + 1, Gl.GL_COMPILE)
If num_shapes = 1 Then
Gl.glPushMatrix()
Gl.glTranslatef(1000, 1000, 1000)
End If
draw_rectangular_face(front_texture, front_face_color, front_face_texture, New ThreeDPoint(startx, starty, startz), New ThreeDPoint(startx + deltax, starty, startz), New ThreeDPoint(startx + deltax, starty + deltay, startz), New ThreeDPoint(startx, starty + deltay, startz), front_face_num_textures)
draw_rectangular_face(back_texture, back_face_color, back_face_texture, New ThreeDPoint(startx, starty, startz), New ThreeDPoint(startx + deltax, starty, startz), New ThreeDPoint(startx + deltax, starty, startz + deltaz), New ThreeDPoint(startx, starty, startz + deltaz), back_face_num_textures)
draw_rectangular_face(top_texture, top_face_color, top_face_texture, New ThreeDPoint(startx, starty, startz + deltaz), New ThreeDPoint(startx + deltax, starty, startz + deltaz), New ThreeDPoint(startx + deltax, starty + deltay, startz + deltaz), New ThreeDPoint(startx, starty + deltay, startz + deltaz), top_face_num_textures)
draw_rectangular_face(bottom_texture, bottom_face_color, bottom_face_texture, New ThreeDPoint(startx, starty + deltay, startz), New ThreeDPoint(startx + deltax, starty + deltay, startz), New ThreeDPoint(startx + deltax, starty + deltay, startz + deltaz), New ThreeDPoint(startx, starty + deltay, startz + deltaz), bottom_face_num_textures)
draw_rectangular_face(left_texture, left_face_color, left_face_texture, New ThreeDPoint(startx + deltax, starty, startz), New ThreeDPoint(startx + deltax, starty + deltay, startz), New ThreeDPoint(startx + deltax, starty + deltay, startz + deltaz), New ThreeDPoint(startx + deltax, starty, startz + deltaz), left_face_num_textures)
draw_rectangular_face(right_texture, right_face_color, right_face_texture, New ThreeDPoint(startx, starty, startz), New ThreeDPoint(startx, starty + deltay, startz), New ThreeDPoint(startx, starty + deltay, startz + deltaz), New ThreeDPoint(startx, starty, startz + deltaz), right_face_num_textures)
If num_shapes = 1 Then
Gl.glPopMatrix()
End If
Gl.glEndList()
这个问题要完全回答有点宽泛。拾取、旋转和平移是三种不同的任务,需要不同的方法。要拾取一个对象,请通过光标发射一条光线,并查看击中的对象。平移可以通过在平面上投影对象来完成,旋转可以通过各种轨迹球实现来处理。我建议你针对一个具体问题提出一个新问题。请同时展示您迄今为止所做的尝试。拾取是一项非常常见的任务。至于选择和“通过对象拍摄光线”,那么我如何用对象的现有坐标建立对象列表?您应该将它们放在内存中的某个位置。不然你怎么能画这些东西呢<代码>框似乎是一个很好的起点。我添加了我用来旋转和平移世界的“DrawScene”sub。我没有意识到我必须将对象的信息存储到tao框架之外的列表中,但我可以做到这一点。我的下一个问题是,如何翻译一个对象,而不是像我在绘图场景中那样翻译所有对象?我还更新了我在翻译方面所做的尝试。