C++ 使用箭头和鼠标计算移动的对象

C++ 使用箭头和鼠标计算移动的对象,c++,opengl,math,C++,Opengl,Math,我正在用openGL做一个maya模拟器应用程序,一切都进展得很好。只是有一个问题,我不能计算100%的准确性移动对象的鼠标。 我正在使用3D坐标中箭头的缩放和屏幕坐标中箭头的缩放,并将其与一些缩放相乘,以计算屏幕坐标x和y方向的运动度。 但由于鼠标偏离了箭头,这些计算的精度不高。我需要它总是在移动的箭头上,这意味着精度几乎是100% 任何对这个问题有想法或意见的人都将受到感谢 这是我尝试的一些代码: gluProject((GLdouble)x3DVertex, (GLdouble)y3DV

我正在用openGL做一个maya模拟器应用程序,一切都进展得很好。只是有一个问题,我不能计算100%的准确性移动对象的鼠标。 我正在使用3D坐标中箭头的缩放和屏幕坐标中箭头的缩放,并将其与一些缩放相乘,以计算屏幕坐标x和y方向的运动度。 但由于鼠标偏离了箭头,这些计算的精度不高。我需要它总是在移动的箭头上,这意味着精度几乎是100% 任何对这个问题有想法或意见的人都将受到感谢

这是我尝试的一些代码:

gluProject((GLdouble)x3DVertex, (GLdouble)y3DVertex, (GLdouble)z3DVertex, modelMatrix, projectMatrix, viewport, &xScreenVertex, &yScreenVertex, &zScreenVertex);

if (axis == 0)
{
gluProject((GLdouble)x3DVertex + 1, (GLdouble)y3DVertex, (GLdouble)z3DVertex, modelMatrix, projectMatrix, viewport, &xScreenArrow, &yScreenArrow, &zScreenArrow);
}
else if (axis == 1)
{
gluProject((GLdouble)x3DVertex, (GLdouble)y3DVertex + 1, (GLdouble)z3DVertex, modelMatrix, projectMatrix, viewport, &xScreenArrow, &yScreenArrow, &zScreenArrow);
}
else
{
gluProject((GLdouble)x3DVertex, (GLdouble)y3DVertex, (GLdouble)z3DVertex + 1, modelMatrix, projectMatrix, viewport, &xScreenArrow, &yScreenArrow, &zScreenArrow);
}
float totalScaleXY = abs(xScreenArrow - xScreenVertex) + abs(yScreenArrow - yScreenVertex);
scaleX = abs(xScreenArrow - xScreenVertex) / totalScaleXY;
scaleY = abs(yScreenArrow - yScreenVertex) / totalScaleXY;
float lengthArrowOnScreen = sqrt(pow((xScreenArrow - xScreenVertex), 2) + pow((yScreenArrow - yScreenVertex), 2));
scale3dAndScreen = 1 / lengthArrowOnScreen;

这是我正在测试的代码,它不是很精确,这里很小但很简单,C++就是我想到的例子:

//---------------------------------------------------------------------------
#包括
#包括
#布拉格语hdrstop
#包括“Unit1.h”
#包括“gl_simple.h”
//---------------------------------------------------------------------------
#pragma包(智能初始化)
#pragma资源“*.dfm”
TForm1*Form1;
//---------------------------------------------------------------------------
双mview[16],mmodel[16],mproj[16];//OpenGL矩阵
//---------------------------------------------------------------------------
//向量/矩阵数学
//---------------------------------------------------------------------------
双向量{返回sqrt((a[0]*a[0])+(a[1]*a[1])+(a[2]*a[2]);}/=|向量[3]|
空向量{for(inti=0;i=2.0*M_-PI){ang=2.0*M_-PI;e=0;}
u0=u1;u1=b*cos(ang);
v0=v1;v1=b*sin(ang);
//X
如果(sel==0)glColor3f(1.0,0.0,0.0);否则glColor3f(0.5,0.1,0.1);
glNormal3f(a*q,(u0+u1)*0.5*q,(v0+v1)*0.5*q);
glVertex3d(o[0]+l[0],o[1],o[2]);
glVertex3d(o[0]+l[0]-a,o[1]+u0,o[2]+v0);
glVertex3d(o[0]+l[0]-a,o[1]+u1,o[2]+v1);
glNormal3f(-1.0,0.0,0.0);
glVertex3d(o[0]+l[0]-a,o[1],o[2]);
glVertex3d(o[0]+l[0]-a,o[1]+u1,o[2]+v1);
glVertex3d(o[0]+l[0]-a,o[1]+u0,o[2]+v0);
//Y
如果(sel==1)glColor3f(0.0,1.0,0.0);否则glColor3f(0.1,0.5,0.1);
glNormal3f((u0+u1)*0.5*q,a*q,(v0+v1)*0.5*q);
glVertex3d(o[0],o[1]+l[1],o[2]);
glVertex3d(o[0]+u1,o[1]+l[1]-a,o[2]+v1);
glVertex3d(o[0]+u0,o[1]+l[1]-a,o[2]+v0);
glNormal3f(0.0,-1.0,0.0);
glVertex3d(o[0],o[1]+l[1]-a,o[2]);
glVertex3d(o[0]+u0,o[1]+l[1]-a,o[2]+v0);
glVertex3d(o[0]+u1,o[1]+l[1]-a,o[2]+v1);
//Z
如果(sel==2)glColor3f(0.0,0.0,1.0);否则glColor3f(0.1,0.1,0.5);
glNormal3f((v0+v1)*0.5*q,(u0+u1)*0.5*q,a*q);
glVertex3d(o[0],o[1],o[2]+l[2]);
glVertex3d(o[0]+v1,o[1]+u1,o[2]+l[2]-a);
glVertex3d(o[0]+v0,o[1]+u0,o[2]+l[2]-a);
glNormal3f(0.0,0.0,-1.0);
glVertex3d(o[0],o[1],o[2]+l[2]-a);
glVertex3d(o[0]+v0,o[1]+u0,o[2]+l[2]-a);
glVertex3d(o[0]+v1,o[1]+u1,o[2]+l[2]-a);
}
格伦德();
}
bool mouse(双mx、双my、Tshift state sh)//如果需要重画,则返回句柄鼠标事件
{
if((mm==NULL)| |(mv==NULL)| |(mp==NULL))返回false;
intql;双p[3],mmvp[16];bool _redraw=false;
//MVP=M*V*P
矩阵μmul(mmvp,mm,mv);
矩阵(mmvp,mmvp,mp);
//将屏幕坐标转换为总账NDC
mx=(2.0*mx/double(xs))-1.0;
my=1.0-(2.0*my/double(ys));
//鼠标左键状态(最后,实际)
ql=sh.Contains(左侧);
//选择(无鼠标按钮)
如果(!ql)
{
int sel0=sel;sel=-1;
//箭头中心屏幕x、y距离鼠标选择(如果关闭)

p[0]=o[0]+l[0]-0.5*a;p[1]=o[1];p[2]=o[2];项目(p,mmvp,p);p[0]=mx;p[1]=my;p[2]=0.0;if(向量_len(p)在代码或公式中显示实际计算本身我只是来寻找我的代码不适合的想法show@David然后我们无法帮助您,因为我们看不到您没有向我们展示的代码/方程式有什么问题。另外,描述是含糊不清的鼠标是如何偏离的?方向正确并且正在跑开或摆动?或者方向不正确?或者什么?我只是问一些代码,看一看,请问你有什么理想的方法来纠正它吗?我已经找到了自己的方法很长一段时间了。但是再上一节课会更好谢谢你^^