国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用opengl繪制茶壺并實(shí)現(xiàn)鼠標(biāo)拖動(dòng)

這篇具有很好參考價(jià)值的文章主要介紹了使用opengl繪制茶壺并實(shí)現(xiàn)鼠標(biāo)拖動(dòng)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

難點(diǎn)如下:

????????坐標(biāo)軸繪制

opengl水壺,numpy,pythonopengl水壺,numpy,python

?

?

????????選定一個(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ù)中

??opengl水壺,numpy,python?opengl水壺,numpy,python?opengl水壺,numpy,python

關(guān)鍵代碼如上圖所示

完整代碼如下:文章來(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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • openlayers實(shí)現(xiàn)鎖定地圖,不可使用鼠標(biāo)拖動(dòng)放大縮小地圖

    openlayers實(shí)現(xiàn)鎖定地圖,不可使用鼠標(biāo)拖動(dòng)放大縮小地圖

    開(kāi)啟地圖鎖定功能,不再允許使用鼠標(biāo)拖拽查看地圖,使用鼠標(biāo)滾輪放大縮小查看地圖 關(guān)鍵代碼 包含業(yè)務(wù)開(kāi)關(guān)的代碼 注:這個(gè)圖是別的大佬整理的 https://www.ktanx.com/blog/p/2656

    2024年02月02日
    瀏覽(33)
  • 3ds MAX繪制茶壺

    3ds MAX繪制茶壺

    綜合一下之前的內(nèi)容畫個(gè)茶壺 ? 長(zhǎng)方形,然后轉(zhuǎn)化為可編輯多邊形,添加節(jié)點(diǎn)并設(shè)置圓角,如下圖 車削生成一個(gè)圓環(huán),其實(shí)這一步也可以用一個(gè)圓柱體和兩個(gè)圓角圓柱體解決 ? ? 效果如下: 茶壺的底座繪制好了 接下來(lái)是茶壺的上半邊 首先繪制一個(gè)半圓 轉(zhuǎn)化為可編輯多邊形

    2024年02月14日
    瀏覽(31)
  • 原生js使用canvas實(shí)現(xiàn)鼠標(biāo)繪制直線

    原生js使用canvas實(shí)現(xiàn)鼠標(biāo)繪制直線

    目錄 目錄 一、原理 二、具體實(shí)現(xiàn) (1)、創(chuàng)建畫布 (2)、獲取鼠標(biāo)位置 (3)、創(chuàng)建線段類 (4)、創(chuàng)建主繪制類 (5)、繪制 (6)、效果圖 ?三、源代碼 1、原生js 2、vue3實(shí)現(xiàn)? 直線可以看成是一小段一小段的線段組成,并且兩點(diǎn)確定一條直線; 首先當(dāng)鼠標(biāo)左鍵點(diǎn)擊時(shí)候

    2024年02月12日
    瀏覽(22)
  • Python 實(shí)現(xiàn)鼠標(biāo)拖動(dòng)截圖

    Python 實(shí)現(xiàn)鼠標(biāo)拖動(dòng)截圖

    此功能由3個(gè).py文件實(shí)現(xiàn),分別為:test00.py、screenshot.py、py_tool.py;實(shí)現(xiàn)鼠標(biāo)附近局部放大,未截圖部分半透明,鼠標(biāo)控制鍵盤精準(zhǔn)截圖,鼠標(biāo)框選后自動(dòng)保存截圖,按下esc鍵退出截圖;

    2024年02月14日
    瀏覽(34)
  • Python實(shí)現(xiàn)鼠標(biāo)拖動(dòng)的監(jiān)視

    目錄 模塊準(zhǔn)備 具體步驟? 設(shè)置監(jiān)視函數(shù) 調(diào)用監(jiān)視器 注意 結(jié)束語(yǔ) 這是用來(lái)監(jiān)視鼠標(biāo)的,pynput模塊中還有監(jiān)視鍵盤的。 ????????首先,設(shè)置一個(gè)全局變量,這個(gè)全局變量是用來(lái)記錄鼠標(biāo)按下和釋放的 設(shè)置監(jiān)視函數(shù) ????????注:這里 on_click 函數(shù)里面有四個(gè)參數(shù),你可以

    2024年02月12日
    瀏覽(23)
  • ThreeJs的場(chǎng)景實(shí)現(xiàn)鼠標(biāo)拖動(dòng)旋轉(zhuǎn)控制

    ????????前面一個(gè)章節(jié)中已經(jīng)實(shí)現(xiàn)在場(chǎng)景中放置一個(gè)正方體,并添加燈光使得正方體可見(jiàn)。但是由于是靜態(tài)的還不能證明是3D的,我們需要添加一些控制器,使得通過(guò)鼠標(biāo)控制正方體可以動(dòng)起來(lái),實(shí)現(xiàn)真正的3D效果,由此引入OrbitControls組件,他實(shí)質(zhì)是改變相機(jī)的位置,實(shí)現(xiàn)

    2024年02月07日
    瀏覽(20)
  • Python: 實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊tkinter窗口任意位置拖動(dòng)

    近期在用python的tkinter庫(kù)開(kāi)發(fā)一個(gè)GUI,在開(kāi)發(fā)接近尾聲時(shí)候,同事發(fā)現(xiàn)一個(gè)問(wèn)題:因GUI窗口較大,在他的筆記本上不能全部展示,而且只能通過(guò)點(diǎn)擊頂部狀態(tài)欄才能拖動(dòng),這樣即使鼠標(biāo)已經(jīng)在屏幕最頂部,也無(wú)法看到窗口底部的控件。 一個(gè)解決方法就是:窗口及控件可以自適

    2024年02月11日
    瀏覽(31)
  • Mkdocs中利用Js實(shí)現(xiàn)大小圈鼠標(biāo)拖動(dòng)樣式

    Mkdocs中利用Js實(shí)現(xiàn)大小圈鼠標(biāo)拖動(dòng)樣式

    在 docs/javascripts/extra.js 下復(fù)制粘貼: 其中比較重要的參數(shù)就是鼠標(biāo)的尺寸和顏色,已經(jīng)在上圖中標(biāo)出,目前發(fā)現(xiàn)顏色只支持RGB寫法和固有名稱寫法(例如red這種),其他參數(shù)也可以自行摸索: 在docs/stylesheets/extra.css添加如下代碼: 這里比較重要的參數(shù)就是鼠標(biāo)跟隨的圓形顏

    2024年02月15日
    瀏覽(21)
  • flutter web項(xiàng)目中鼠標(biāo)拖動(dòng)無(wú)法實(shí)現(xiàn)滾動(dòng)效果

    在完成web的flutter項(xiàng)目時(shí),發(fā)現(xiàn)ListView列表使用鼠標(biāo)拖動(dòng)無(wú)法滾動(dòng),嘗試發(fā)現(xiàn)使用觸摸板可以實(shí)現(xiàn)滾動(dòng),但如果用戶使用沒(méi)有觸摸板的電腦或列表為橫向滾動(dòng)時(shí)就無(wú)法實(shí)現(xiàn)項(xiàng)目需求了,在解決問(wèn)題的過(guò)程中嘗試了以下方法: 1.嘗試使用點(diǎn)擊事件模擬滑動(dòng)手勢(shì) 如果web項(xiàng)目中無(wú)法使

    2024年02月09日
    瀏覽(30)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包