热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何使用鼠标在PyOpenGL中控制相机?-HowdoIcontrolthecamerainPyOpenGLusingamouse?

Weneedtomakea3DgameinpythonsoinmyresearchIdiscoveredPyOpenGL.Afterabitofplaying

We need to make a 3D game in python so in my research I discovered PyOpenGL. After a bit of playing around with I became stumped on how to move the camera around. Give me some sample code and an explanation.

我们需要在python中制作3D游戏,所以在我的研究中我发现了PyOpenGL。经过一段时间的游戏,我变得难以理解如何移动相机。给我一些示例代码和解释。

1 个解决方案

#1


PyOpenGL is a binding for OpenGL. You need to use some framework to create windows and handle windowing events. In the past I've used pyglet for window creation / input handling / sound. Other common options here include SDL and pySFML but there really are quite a few.

PyOpenGL是OpenGL的绑定。您需要使用一些框架来创建窗口并处理窗口事件。在过去,我使用pyglet进行窗口创建/输入处理/声音。这里的其他常见选项包括SDL和pySFML,但实际上有很多。

After that its a matter of deciding how the camera should work and using the input to modify your camera properties. Once you have, say, well defined position, forward, and up vectors for the camera you can turn these things into a matrix that transforms your scene into the point of view of the camera.

之后,确定相机应如何工作并使用输入来修改相机属性。一旦你拥有了明确定义的摄像机位置,前移和向上矢量,你就可以将这些东西变成一个矩阵,将你的场景转换成摄像机的视角。

Using OpenGL directly is very low level. It's left up to you to define exactly how this should work.

直接使用OpenGL是非常低的水平。您可以自行定义它应该如何工作。

Here's some code of mine that uses numpy. You can manipulate the camera using the interface functions in spatial.py (tie these to the mouse input events)

这是我的一些使用numpy的代码。您可以使用spatial.py中的接口函数操作相机(将这些功能与鼠标输入事件联系起来)

Once those work you can get the relevant matrices (as numpy arrays) with

一旦这些工作,您可以获得相关的矩阵(如numpy数组)

Camera.get_projection_matrix()

and

Camera.get_camera_matrix()

For instance in one of my projects I initialize the camera with

例如,在我的一个项目中,我用相机初始化相机

def setupView(self):
    self.camera = Camera()
    self.camera.set_position(v3(3, 0, 10))
    self.camera.look_at(v3(0, 0, 0))

and then sync the camera to the player (just another Spatial) with

然后将相机同步到播放器(只是另一个空间)

def updateCamera(self):
    up = v3(*self.player.get_world_up())
    position = v3(*self.player.get_position())
    position += (v3(*self.player.get_world_forward()) * -10.0)
    position += (up * 3.0)

    self.camera.set_position(position)
    self.camera.set_orientation(self.player.get_orientation())

The mouse events affect the player

鼠标事件会影响播放器

def on_mouse_motion(self, x, y, dx, dy):
    self.player.yaw(-dx * 0.005)
    self.player.pitch(dy * 0.005)

On draw then passes the camera matrix to a vertex shader

在绘制时,然后将相机矩阵传递到顶点着色器

def on_draw(self, renderer, t, dt):
    ...
    matC = camera.get_camera_matrix()
    renderer.set_shader_mat44('matC', matC)
    ...

And the vertex shader takes care of the actual vertex transformations by left multiplying C with the current modelview matrix.

并且顶点着色器通过左边将C与当前模型视图矩阵相乘来处理实际的顶点变换。

This is not for faint of heart :)

这不适合胆小的人:)


推荐阅读
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
author-avatar
胡萝卜咯198408
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有