難點(diǎn)如下:
????????坐標(biāo)軸繪制
?
?
????????選定一個(gè)原點(diǎn),將坐標(biāo)軸正方向和反方向的倆個(gè)點(diǎn)進(jìn)行連線,代碼及效果如上圖所示(本次程序中由于渲染原因,坐標(biāo)軸顏色統(tǒng)一為棕色)
????????如何實(shí)現(xiàn)鼠標(biāo)響應(yīng)
????????OPENGL中封存有對(duì)鼠標(biāo)進(jìn)行相應(yīng)的函數(shù),但使用起來(lái)無(wú)法實(shí)現(xiàn)效果,于是我們需要進(jìn)行一些偏移量計(jì)算以完成角度的拖拽,這在一定程度上給參考了solidworks中3D物品旋轉(zhuǎn)的方式。
? ? ? ? 1.計(jì)算鼠標(biāo)距上一幀的偏移量。
? ? ? ? 2.把偏移量添加到攝像機(jī)的俯仰角和偏航角中。
? ? ? ? 3.對(duì)偏航角和俯仰角進(jìn)行最大和最小值的限制。
? ? ? ? 4.計(jì)算方向向量。
? ? ? ? 5.將其封裝到函數(shù)中
???
?
關(guān)鍵代碼如上圖所示文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-796862.html
完整代碼如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-796862.html
import numpy as np
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
IS_PERSPECTIVE = True # 透視投影
VIEW = np.array([-0.8, 0.8, -0.8, 0.8, 0.5, 20.0]) # 視景體的left/right/bottom/top/near/far六個(gè)面
LEFT_IS_DOWNED = False
CameraPos = np.array([0.0, 0.0, 2])
CameraFront = np.array([0, 0, 0])
CameraUp = np.array([0, 1, 0])
SCALE_K = np.array([1, 1, 1])
yaw = 0
pitch = 0
MOUSE_X, MOUSE_Y = 0, 0
WIN_W = 640
WIN_H = 480
class MyPyOpenGLTest:
def Mouse_click(self,button, state, x, y):
global LEFT_IS_DOWNED
global MOUSE_X, MOUSE_Y
global SCALE_K
MOUSE_X = x
MOUSE_Y = y
if button == GLUT_LEFT_BUTTON:
LEFT_IS_DOWNED = state == GLUT_DOWN
def Mouse_motion(self,x, y):
global LEFT_IS_DOWNED
global MOUSE_X, MOUSE_Y
global yaw, pitch
global CameraPos
if LEFT_IS_DOWNED:
dx = x - MOUSE_X
dy = MOUSE_Y - y
MOUSE_X = x
MOUSE_Y = y
sensitivity = 0.2
dx = dx * sensitivity
dy = dy * sensitivity
yaw = yaw + dx
pitch = pitch + dy
if pitch > 89:
pitch = 89
if pitch < -89:
pitch = -89
CameraPos[0] = np.cos(np.radians(yaw)) * np.cos(np.radians(pitch))
CameraPos[1] = np.sin(np.radians(pitch))
CameraPos[2] = np.sin(np.radians(yaw)) * np.cos(np.radians(pitch))
glutPostRedisplay()
def __init__(self,width=640,height=480,title=b'SolidTeapot'):
glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH)
glutInitWindowSize(width,height)
self.window=glutCreateWindow(title)
glutDisplayFunc(self.Draw)
glutKeyboardFunc(self.BarPress)
glutIdleFunc(self.Draw)
self.InitGL(width,height)
glutMouseFunc(self.Mouse_click)
glutMotionFunc(self.Mouse_motion)
self.x=0.0
self.y=0.0
self.z=0.0
self.s=0.2
def BarPress(self, key, x, y):
if key==b'a':
self.x+=1
elif key ==b'd':
self.x-=1
elif key ==b'w':
self.y+=1
elif key ==b's':
self.y-=1
elif key ==b'q':
self.z-=1
elif key ==b'e':
self.z+=1
elif key ==b'x':
self.s-=0.1
elif key ==b'z':
self.s+=0.1
def Draw(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
glTranslate(0.0,0.0,-8.0)
global IS_PERSPECTIVE, VIEW
global CameraPos, CameraFront, CameraUp
global SCALE_K
global WIN_W, WIN_H
global vertices2
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# 設(shè)置投影(透視投影)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
if IS_PERSPECTIVE:
glFrustum(VIEW[0], VIEW[1], VIEW[2], VIEW[3], VIEW[4], VIEW[5])
# 設(shè)置模型視圖
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
# 幾何變換
glScale(SCALE_K[0], SCALE_K[1], SCALE_K[2])
# 視點(diǎn)
gluLookAt(
CameraPos[0], CameraPos[1], CameraPos[2],
CameraFront[0], CameraFront[1], CameraFront[2],
CameraUp[0], CameraUp[1], CameraUp[2]
)
glViewport(0, 0, WIN_W, WIN_H)
glBegin(GL_LINES)
# 以紅色繪制x軸
glColor3f(1.0, 0.0, 0.0) # 設(shè)置當(dāng)前顏色為紅色不透明
glVertex3f(-0.5, 0.0, 0.0) # 設(shè)置x軸頂點(diǎn)(x軸負(fù)方向)
glVertex3f(0.5, 0.0, 0.0) # 設(shè)置x軸頂點(diǎn)(x軸正方向)
# 以綠色繪制y軸
glColor3f(0.0, 1.0, 0.0) # 設(shè)置當(dāng)前顏色為綠色不透明
glVertex3f(0.0, -0.5, 0.0) # 設(shè)置y軸頂點(diǎn)(y軸負(fù)方向)
glVertex3f(0.0, 0.5, 0.0) # 設(shè)置y軸頂點(diǎn)(y軸正方向)
# 以藍(lán)色繪制z軸
glColor3f(0.0, 0.0, 1.0) # 設(shè)置當(dāng)前顏色為藍(lán)色不透明
glVertex3f(0.0, 0.0, -0.5) # 設(shè)置z軸頂點(diǎn)(z軸負(fù)方向)
glVertex3f(0.0, 0.0, 0.5) # 設(shè)置z軸頂點(diǎn)(z軸正方向)
glEnd()
glRotate(self.x,1.0,0.0,0.0)
glRotate(self.y, 0.0, 1.0, 0.0)
glRotate(self.z, 0.0, 0.0, 1.0)
glScalef(self.s,self.s,self.s)
glColor3f(0.0,0.0,1.0)
glutSolidTeapot(1.0)
glutSwapBuffers()
def InitGL(self,width,height):
glClearColor(1.0,1.0,1.0,0.0)
glClearDepth(1.0)
glDepthFunc(GL_LESS)
mat_SP=(1.0,1.0,1.0,1.0)
mat_sh=[50.0]
light_position=(-0.5,1.5,1,0)
yellow_l=(1.0,0.1,0,1)
ambient=(0.1,0.8,0.2,1.0)
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_SP)
glMaterialfv(GL_FRONT,GL_SHININESS,mat_sh)
glLightfv(GL_LIGHT0,GL_POSITION,light_position)
glLightfv(GL_LIGHT0,GL_DIFFUSE ,yellow_l )
glLightfv(GL_LIGHT0,GL_SPECULAR ,yellow_l )
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glEnable(GL_DEPTH_TEST)
glEnable(GL_BLEND)
glShadeModel(GL_SMOOTH)
glEnable(GL_POINT_SMOOTH)
glEnable(GL_LINE_SMOOTH)
glEnable(GL_POLYGON_SMOOTH)
glMatrixMode(GL_PROJECTION)
glHint(GL_POINT_SMOOTH_HINT,GL_NICEST)
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST)
glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST)
glLoadIdentity()
gluPerspective(45.0,float(width)/float(height),0.1,100.0)
glMatrixMode(GL_MODELVIEW)
def MainLoop(self):
glutMainLoop()
if __name__=='__main__':
w=MyPyOpenGLTest()
w.MainLoop()
到了這里,關(guān)于使用opengl繪制茶壺并實(shí)現(xiàn)鼠標(biāo)拖動(dòng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!