- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 OpenGL 中设置相机来查看 3 维中的某些点。为了实现这一点,我不想使用旧的、固定的功能样式(glMatrixMode()、glTranslate 等),而是自己设置模型 View 投影矩阵并在我的顶点着色器中使用它。正交投影就足够了。
很多关于这方面的教程似乎都使用 glm 库,但由于我对 OpenGL 完全陌生,我想以正确的方式学习它,然后使用一些第三方库。此外,大多数教程没有描述如何使用 glMotionFunc() 和 glMouseFunc() 在空间中定位相机。
所以,我想我正在寻找一些示例代码和指导如何以 3D 形式查看我的点。这是我编写的顶点着色器:
const GLchar *vertex_shader = // Vertex Shader
"#version 330\n"
"layout (location = 0) in vec4 in_position;"
"layout (location = 1) in vec4 in_color;"
"uniform float myPointSize;"
"uniform mat4 myMVP;"
"out vec4 color;"
"void main()"
"{"
" color = in_color;"
" gl_Position = in_position * myMVP;"
" gl_PointSize = myPointSize;"
"}\0";
我在着色器设置方法中将 MVP 的初始值设置为单位矩阵,这为我的点提供了正确的 2D 表示:
// Set up initial values for uniform variables
glUseProgram(shader_program);
location_pointSize = glGetUniformLocation(shader_program, "myPointSize");
glUniform1f(location_pointSize, 25.0f);
location_mvp = glGetUniformLocation(shader_program, "myMVP");
float mvp_array[16] = {1.0f, 0.0f, 0.0f, 0.0f, // 1st column
0.0f, 1.0f, 0.0f, 0.0f, // 2nd column
0.0f, 0.0f, 1.0f, 0.0f, // 3rd column
0.0f, 0.0f, 0.0f, 1.0f // 4th column
};
glUniformMatrix4fv(location_mvp, 1, GL_FALSE, mvp_array);
glUseProgram(0);
现在我的问题是如何调整“motion”和“mouse”这两个函数,到目前为止,这两个函数只有前面示例中的一些代码,其中使用了已弃用的执行此操作的样式:
// OLD, UNUSED VARIABLES
int mouse_old_x;
int mouse_old_y;
int mouse_buttons = 0;
float rotate_x = 0.0;
float rotate_y = 0.0;
float translate_z = -3.0;
...
// set view matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, translate_z);
glRotatef(rotate_x, 1.0, 0.0, 0.0);
glRotatef(rotate_y, 0.0, 1.0, 0.0);
...
// OLD, UNUSED FUNCTIONS
void mouse(int button, int state, int x, int y)
{
if (state == GLUT_DOWN)
{
mouse_buttons |= 1<<button;
}
else if (state == GLUT_UP)
{
mouse_buttons = 0;
}
mouse_old_x = x;
mouse_old_y = y;
}
void motion(int x, int y)
{
float dx, dy;
dx = (float)(x - mouse_old_x);
dy = (float)(y - mouse_old_y);
if (mouse_buttons & 1)
{
rotate_x += dy * 0.2f;
rotate_y += dx * 0.2f;
}
else if (mouse_buttons & 4)
{
translate_z += dy * 0.01f;
}
mouse_old_x = x;
mouse_old_y = y;
}
最佳答案
I'd like to learn it the right way and afterwards use some third party libraries.
使用 GLM 没有任何问题,因为 GLM 只是一个处理矩阵的数学库。您想学习最基本的知识是一件非常好的事情。如今这种特征很少见。在进行高级 OpenGL 开发时,了解这些知识非常宝贵。
好的,您需要学习三件事:
基本离散线性代数,即如何处理具有离散元素的矩阵和向量。标量和复杂元素暂时就足够了。
一点数字。您必须能够编写执行基本线性代数运算的代码:缩放、添加向量、执行向量的内积和外积。执行矩阵-向量和矩阵-矩阵乘法。矩阵求逆。
了解齐次坐标。
(4.如果你想让事情变得有趣,学习四元数,那些东西很摇滚!)
完成第 3 步后,您就可以编写自己的线性数学代码了。即使您还不知道齐次坐标。只需编写它就可以有效地处理 4×4 维矩阵和 4 维向量。
一旦掌握了齐次坐标,您就会了解 OpenGL 的实际用途。然后:放弃那些最初的编码步骤来编写自己的线性数学库。为什么?因为它会充满错误。我维护的那一小本 linmath.h 就充满了它们;每次我在新项目中使用它时,我都会修复其中的一些问题。因此,我建议您使用经过充分测试的东西,例如 GLM 或 Eigen。
I set up the initial value of the MVP to be the identity matrix in my shader set up method which gives me the correct 2D representation of my points:
您应该将它们分成 3 个矩阵:模型、 View 和投影。在你的着色器中你应该有两个,模型 View 和投影。 IE。您按原样将投影传递给着色器,但计算以单独的统一形式传递的复合Model·View = Modelview
矩阵。
要移动“相机”,您需要修改View
矩阵。
Now my question is how to adapt the two functions "motion" and "mouse", which to this point only have some code from a previous example, where the deprecated style of doing this was used:
大部分代码保持不变,因为它不涉及 OpenGL。您必须替换的是那些 glRotate 和 glTranslate 调用。
如前所述,您正在处理View
矩阵。首先让我们看看 glRotate 做了什么。在固定函数 OpenGL 中,有一个内部别名,我们称之为 M,它被设置为使用 glMatrixMode 选择的任何矩阵。然后我们可以将glRotate的伪代码写为
proc glRotate(angle, vec_x, vec_y, vec_z):
mat4x4 R = make_rotation_matrix(angle, vec_x, vec_y, vec_z)
M = M · R
好吧,所有的魔力似乎都在于函数 make_rotation_matrix
中。那个看起来怎么样。既然你正在学习线性代数,这对你来说是一个很好的练习。查找具有以下属性的矩阵 R
:
l a = R·a
,其中a是旋转轴
cos(phi) = b·c && b·a = 0 && b·c = 0
,其中 phi 是旋转角度
由于您可能只想完成这件事,因此您也可以查看 OpenGL-1.1 规范,该规范在有关 glRotatef 的部分中记录了该矩阵
在它们旁边,您可以找到所有其他矩阵操作函数的规范。
现在,您不再需要对使用 glMatrixMode 选择的某些隐藏状态变量进行操作,而是让矩阵数学库直接对您定义和提供的矩阵变量进行操作。在您的情况下查看
。与Projection
和Model
类似。然后,当您进行渲染时,您将模型和 View 收缩到已经提到的复合体中。原因是,您通常需要将顶点位置带入视空间的中间结果(对于片段着色器来说,Modelview *position
)。确定矩阵值后,您可以绑定(bind)程序 (glUseProgram) 并设置统一值,然后渲染几何图形。 (glDraw...)
关于opengl - 如何使用鼠标改变OpenGL相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14172331/
我正在尝试为我的网站创建一个功能,允许用户使用 mousemove 和 touchmove 事件水平滚动 div 内容(类似于 Apple AppStore any app Screenshots s
我有固定的侧边栏导航栏,它在悬停时工作,但我想通过单击折叠按钮打开第一个菜单。类似于悬停在菜单 1 上的工作方式。我已经尝试了以下方法。 jsfiddle Demo $(document).on('c
Mouse.Synchronize() 在 .Net 中有什么作用? MSDN 说它“强制鼠标重新同步” 最佳答案 只是我的假设: Stylus 中存在类似的方法类别:Stylus.Synchroni
有没有什么办法可以同时使用鼠标, pygame.mouse.set_visible(False) 已激活。当前鼠标仅在尝试使用时返回右下坐标。需要在隐藏鼠标时能够获得正确的坐标。 在他们的 docum
我有一个缺少数据的数据库。我需要估算数据(我使用的是鼠标),然后根据原始列创建新列(使用估算数据)。我需要使用这些新列进行统计分析。 具体来说,我的参与者使用李克特 7 分量表填写了几份问卷。有些人没
我正在编写一个与电脑交互的机器人。简而言之,我所做的是: -截取屏幕截图- 在此屏幕截图上识别对象(使用 cv2 matchTemplate) -使用找到的位置进行一些鼠标操作(例如:将鼠标指针移动到
我的程序是一个文本游戏,它使用 WindowsForm 上的文本框模拟控制台输出。我试图实现的一个功能是通过单击一个按钮,它将以一定的速度输出到 TextBox,这是通过这种方法实现的 atm: pu
我遇到了一个问题。如果有任何帮助,我将不胜感激。 我正在尝试从玩家位置射击到鼠标点击位置。代码没有给我任何错误,根据我的逻辑,它应该可以工作,但它没有 它创建了项目符号对象,仅此而已。 //Bulle
给定一个带蓝牙的 Windows Mobile 6.1 智能手机,我想将它注册为鼠标。 基本上我现在做的: 使用 Guid {00001124-0000-1000-8000-00805f9b34fb}
我有一个关于在 JavaFX 中实现鼠标拖动事件的正确方法的问题。 我的 playGame() 方法当前使用 onMouseClicked,但这只是一个占位符 理想情况下,我希望“飞盘”沿着鼠标拖动的
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我目前正在使用 Windows 的 RawInput API 来访问键盘和鼠标输入。我有点困惑的一件事是,当我将鼠标注册为 RawInputDevice 时,我无法移动我的 Win32 窗口或使用那里
我想在我的网站浏览器窗口中 move 鼠标,如下所示:www.lmsify.com。我怎样才能做到这一点?(javascript、flash、activex) 问候,丽莎M 最佳答案 他们并没有真正
我想要一个动画。我是后端开发人员,但我必须使用 jquery 创建动画。 动画、背景和元素位置随鼠标移动而变化。 类似于http://www.kennedyandoswald.com/#!/premi
如何将鼠标“锁定”到某个 OpenGL 窗口。有点像在 Minecraft 中是如何完成的。GameDev 是一个更好的询问地点吗? 最佳答案 正如 Robert 在评论中所说,OpenGL 实际上并
我正在尝试实现一个颜色选择器,它从屏幕上各处的像素中获取颜色。为此,我计划使用全局鼠标 Hook 来监听 WM_MOUSEMOVE,以便在鼠标四处移动时更新颜色,并监听鼠标点击以确认 (WM_LBUT
如何使用 Java 和 JNA(Java native 访问)与 Windows API 交互?。我试图通过在鼠标输入流上排队鼠标事件来让鼠标做某事,并且代码有效,因为 SendInput(...)
我想用 C++ 脚本 move 鼠标光标。我在 Parallels 中的 Windows 7 中使用 Visual C++ 2010 Express,并创建了一个控制台应用程序。 我知道 SetCur
我有一些关于 WH_MOUSE 的问题。根据我的阅读,通过将钩子(Hook)放入 DLL 中,它会注入(inject)进程。这是否意味着捕获鼠标也适用于我的桌面、菜单启动等?那么应用程序的标题栏呢?我
如何为多只鼠标显示另一个光标? 我有两个 TMemos,两个可以输入各自 TMemo 的键盘,2 个鼠标,我需要 2 个光标。 如果假设的话,我已经可以检测出哪只鼠标是哪只了。我怎样才能让我自己的光标
我是一名优秀的程序员,十分优秀!