Сбор, перевод, вращение объектов. Как мне это сделать?
Вступление
В настоящее время я использую инфраструктуру TAO для рисования графики в OpenGL. Ниже приведен мой код для рисования блоков любого размера с использованием текстур или цветов, независимо от того, что указал пользователь. Это прекрасно работает при рисовании, как показано ниже.
Проект написан на VB .NET 2010, но так как большая часть его написана с помощью 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
Моя функция draw_box
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
Я попытался сделать следующее, чтобы перевести форму № 1 в 1000,1000,1000 безуспешно:
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()