
鼠标点只有二维的位置。屏幕哪有z值?除非你是想在三维空间中拾取,但是鼠标的位置也是二维的。只不过你可以根据比较鼠标拾取到的对象的深度,来判断拾取到的是哪个对象。
获取二维位置我倒是知道:如果你用的是红宝书上的那种程序结构,也就是控制台程序,那么你就可以调用glutMouseFunc(void(func)(int button,int state,int x,int y))在你的main里面注册一个函数func 得到鼠标的状态和位置,如果你用的是NEHE那种程序结构,你就使用windows的WM_LBUTTONDOWN等来获取鼠标位置了。
//
//rotAxis3D_Tech_Matrix
//rotate point or vector by give reference axis and angle(in radius)
//Note this function use Row vector multipily Matrix from left
//Paras:
//theta: rotation angle
// nx ny nz: rotation Refernce Axis
//ptIn: input point or vector
//ptOut: output point or vector
//
//Module Sehnsucht in Prj White Board
//
void rotAxis3D_Tech_Matrix(float theta, float nx, float ny, float nz, float (&ptIn)[3], float (&ptOut)[3])
{
float len = sqrtf(nx nx + ny ny + nz nz); //normalize vector
nx /= len; ny /= len; nz /= len;
ptOut[0] = ptIn[0] (cosf(theta) + nx nx (1 - cosf(theta))) + //transform by matrix
ptIn[1] (nx ny (1 - cosf(theta)) - nz sinf(theta)) +
ptIn[2] (nx nz (1 - cosf(theta) + ny sinf(theta)));
ptOut[1] = ptIn[0] (nx ny (1 - cosf(theta)) + nz sinf(theta)) +
ptIn[1] (ny ny (1 - cosf(theta)) + cosf(theta)) +
ptIn[2] (ny nz (1 - cosf(theta)) - nx sinf(theta));
ptOut[2] = ptIn[0] (nx nz (1 - cosf(theta) - ny sinf(theta))) +
ptIn[1] (ny nz (1 -cosf(theta)) + nx sinf(theta)) +
ptIn[2] (nz nz (1 - cosf(theta)) + cosf(theta));
}
直接给出个算法吧,,这个算法直接用矩阵作的,,在一般情况下也就不用四元数了。
晕,,哥哥看错了,,你是问OpenGL,那把上面公式中的矩阵提取出来,,注意到这个矩阵是三阶的,,最后一行是给你设置平移参数的。可以简单设置为 0 0 0 1
构造好矩阵之后,调用glLoadMatrixf设置ModelView矩阵就OK了,,
上面矩阵如何提取?
(cosf(theta) + nx nx (1 - cosf(theta)))
(nx ny (1 - cosf(theta)) - nz sinf(theta))
(nx nz (1 - cosf(theta) + ny sinf(theta))) 这是第一列,其他两列也这么提取就可以了
当然这是假设没有平移和缩放变换的
你在进行
glTranslatef(……)
glRotatef(……)
glRotatef(……)
glRotatef(……)
这些变换之前,先把当前矩阵保存起来,进行变换之后再还原,也就是这样:
glPushMatrix();
glTranslatef(……)
glRotatef(……)
glRotatef(……)
glRotatef(……)
glPopMatrix();
这样之后 所用的坐标还是世界坐标。做的变换世界上是在原来的世界坐标矩阵上乘以变化矩阵,如果不进行保存的话,那么世界矩阵也变了。
double modelview[16];
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
modelview就是你想获得的坐标矩阵。
假设我们有三角形的三个点的数据,每个顶点由 (x, y, z) 三个基向量表示,每个纹理由 (u, v) 两个基向量表示。
OpenGL 中处理数据没有像面向语言一样那么结构化的存取,只能使用数组的方式进行存取(开发者需要自己知道数组中每个数据表示什么意思)。
上面的程序块首先将 JVM 中的数据数组 mTriangleVerticeData 转移到直接内存 mTriangleVertices 中,然后再从直接内存中按块读出数据,拷贝到 GPU 存储空间的 aPositionHandle 地址。
我们先来看看绘制的 Shader 程序:
我们在 onDrawFrame() 绘画时也要注意取值使用 GL_POINTS ,这样就会两个 float 一组地取。 gl_PointSize 单位为像素。
假设我们需要画的点为 (0, 0) :
按照上面的步骤,我们首先将 JVM 数据拷贝到直接内存中:
然后在 onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) 方法中通过 glGetUniformLocation 或 glGetAttribLocation 来获取点坐标存储在 GPU 中的位置值,并将直接内存中的点坐标数据拷贝到该地址指针中。最后调用 glEnableVertexAttribArray(aPositionLocation) 来使能 aPositionLocation 。
然后在 onDrawFrame(GL10) 时,指明每一帧的绘制的数据颜色和位置。
其中 glUniform4f 中指明的颜色是 R, G, B, A 排列。上面的 (00f, 10f, 05f, 10f) 表示绿色,每个元素的取值范围是 00f ~ 10f 之间,表示 0~255 的归一化数据。
>
x,y为鼠标按下式,光标相对于窗口左上角的位置
void glutMotionFunc(void (func)(int x, int y));
void glutPassiveMotionFunc(void (func)(int x, int y)); 设置移动回调函数;设置当前鼠标移动函数
Func为注册的鼠标移动函数
x,y为鼠标按下式,光标相对于窗口左上角的位置
当鼠标在窗口中按下并移动时调用glutMotionFunc注册的回调函数
当鼠标在窗口中移动时调用glutPassiveMotionFunc注册的回调函数
以上就是关于如何通过鼠标点击获得鼠标点的三维世界坐标呢OPENGL全部的内容,包括:如何通过鼠标点击获得鼠标点的三维世界坐标呢OPENGL、求算法:opengl 绕任意轴旋转后的坐标、使用openGL如何计算世界坐标等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)