使用opengl绘制茶壶并实现鼠标拖动

这篇具有很好参考价值的文章主要介绍了使用opengl绘制茶壶并实现鼠标拖动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

难点如下:

        坐标轴绘制

opengl水壶,numpy,pythonopengl水壶,numpy,python

 

 

        选定一个原点,将坐标轴正方向和反方向的俩个点进行连线,代码及效果如上图所示(本次程序中由于渲染原因,坐标轴颜色统一为棕色)

        如何实现鼠标响应

        OPENGL中封存有对鼠标进行相应的函数,但使用起来无法实现效果,于是我们需要进行一些偏移量计算以完成角度的拖拽,这在一定程度上给参考了solidworks中3D物品旋转的方式。

        1.计算鼠标距上一帧的偏移量。

        2.把偏移量添加到摄像机的俯仰角和偏航角中。

        3.对偏航角和俯仰角进行最大和最小值的限制。

        4.计算方向向量。

        5.将其封装到函数中

  opengl水壶,numpy,python opengl水壶,numpy,python opengl水壶,numpy,python

关键代码如上图所示

完整代码如下:文章来源地址https://www.toymoban.com/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六个面
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)

        # 设置投影(透视投影)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()

        if IS_PERSPECTIVE:
            glFrustum(VIEW[0], VIEW[1], VIEW[2], VIEW[3], VIEW[4], VIEW[5])

        # 设置模型视图
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()

        # 几何变换
        glScale(SCALE_K[0], SCALE_K[1], SCALE_K[2])

        # 视点
        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)  # 设置当前颜色为红色不透明
        glVertex3f(-0.5, 0.0, 0.0)  # 设置x轴顶点(x轴负方向)
        glVertex3f(0.5, 0.0, 0.0)  # 设置x轴顶点(x轴正方向)

        # 以绿色绘制y轴
        glColor3f(0.0, 1.0, 0.0)  # 设置当前颜色为绿色不透明
        glVertex3f(0.0, -0.5, 0.0)  # 设置y轴顶点(y轴负方向)
        glVertex3f(0.0, 0.5, 0.0)  # 设置y轴顶点(y轴正方向)

        # 以蓝色绘制z轴
        glColor3f(0.0, 0.0, 1.0)  # 设置当前颜色为蓝色不透明
        glVertex3f(0.0, 0.0, -0.5)  # 设置z轴顶点(z轴负方向)
        glVertex3f(0.0, 0.0, 0.5)  # 设置z轴顶点(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()



到了这里,关于使用opengl绘制茶壶并实现鼠标拖动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • openlayers实现锁定地图,不可使用鼠标拖动放大缩小地图

    开启地图锁定功能,不再允许使用鼠标拖拽查看地图,使用鼠标滚轮放大缩小查看地图 关键代码 包含业务开关的代码 注:这个图是别的大佬整理的 https://www.ktanx.com/blog/p/2656

    2024年02月02日
    浏览(39)
  • 3ds MAX绘制茶壶

    综合一下之前的内容画个茶壶   长方形,然后转化为可编辑多边形,添加节点并设置圆角,如下图 车削生成一个圆环,其实这一步也可以用一个圆柱体和两个圆角圆柱体解决     效果如下: 茶壶的底座绘制好了 接下来是茶壶的上半边 首先绘制一个半圆 转化为可编辑多边形

    2024年02月14日
    浏览(23)
  • 原生js使用canvas实现鼠标绘制直线

    目录 目录 一、原理 二、具体实现 (1)、创建画布 (2)、获取鼠标位置 (3)、创建线段类 (4)、创建主绘制类 (5)、绘制 (6)、效果图  三、源代码 1、原生js 2、vue3实现  直线可以看成是一小段一小段的线段组成,并且两点确定一条直线; 首先当鼠标左键点击时候

    2024年02月12日
    浏览(35)
  • Python 实现鼠标拖动截图

    此功能由3个.py文件实现,分别为:test00.py、screenshot.py、py_tool.py;实现鼠标附近局部放大,未截图部分半透明,鼠标控制键盘精准截图,鼠标框选后自动保存截图,按下esc键退出截图;

    2024年02月14日
    浏览(24)
  • Python实现鼠标拖动的监视

    目录 模块准备 具体步骤  设置监视函数 调用监视器 注意 结束语 这是用来监视鼠标的,pynput模块中还有监视键盘的。         首先,设置一个全局变量,这个全局变量是用来记录鼠标按下和释放的 设置监视函数         注:这里 on_click 函数里面有四个参数,你可以

    2024年02月12日
    浏览(26)
  • ThreeJs的场景实现鼠标拖动旋转控制

            前面一个章节中已经实现在场景中放置一个正方体,并添加灯光使得正方体可见。但是由于是静态的还不能证明是3D的,我们需要添加一些控制器,使得通过鼠标控制正方体可以动起来,实现真正的3D效果,由此引入OrbitControls组件,他实质是改变相机的位置,实现

    2024年02月07日
    浏览(43)
  • Python: 实现鼠标点击tkinter窗口任意位置拖动

    近期在用python的tkinter库开发一个GUI,在开发接近尾声时候,同事发现一个问题:因GUI窗口较大,在他的笔记本上不能全部展示,而且只能通过点击顶部状态栏才能拖动,这样即使鼠标已经在屏幕最顶部,也无法看到窗口底部的控件。 一个解决方法就是:窗口及控件可以自适

    2024年02月11日
    浏览(44)
  • flutter web项目中鼠标拖动无法实现滚动效果

    在完成web的flutter项目时,发现ListView列表使用鼠标拖动无法滚动,尝试发现使用触摸板可以实现滚动,但如果用户使用没有触摸板的电脑或列表为横向滚动时就无法实现项目需求了,在解决问题的过程中尝试了以下方法: 1.尝试使用点击事件模拟滑动手势 如果web项目中无法使

    2024年02月09日
    浏览(30)
  • Mkdocs中利用Js实现大小圈鼠标拖动样式

    在 docs/javascripts/extra.js 下复制粘贴: 其中比较重要的参数就是鼠标的尺寸和颜色,已经在上图中标出,目前发现颜色只支持RGB写法和固有名称写法(例如red这种),其他参数也可以自行摸索: 在docs/stylesheets/extra.css添加如下代码: 这里比较重要的参数就是鼠标跟随的圆形颜

    2024年02月15日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包