实例
如图中 红色是黑色长方形的x轴 蓝色是z轴 绿色是y轴 我们如果点击相应轴向正或负方向移动 物体也会跟着移动
实现过程
1.首先我们为需要被移动的物体和坐标轴都设置了objID用于拾取(具体实现方法看3d拾取)
shader.setInt("gobjectIndex", i);
2.当我们鼠标点击屏幕时会拾取点击处的像素所对应objID以确定我们是否点击到了物体
//如果鼠标点击到了物体 该物体是我们想要移动的物体时 我们将坐标系移动到物体的中心方便移动
if (obID > 0.2) //写0.2的原因是obID在没被赋值的时候是0.1而不是0
{
glm::mat4 temp(1.0);
temp = glm::translate(model[changeID], triangle.getCenter());//该temp矩阵是位移到目标物体中心的矩阵
csys.setModel(temp);
}
3.当我们点击到的objID不为坐标轴时 那么将该objID赋值给changeID 就是我们想要移动的物体的objID记录下来
if (obID < 100)
changeID = obID;
4.我们再点击物体上相应的坐标轴 此时会对点击的像素objID进行判断 如果是100,101,102则代表是坐标轴 就通过鼠标在世界坐标系中的差值进行相应轴的矩阵变换
else if(obID>=100&&obID<=103) //如果objID大于等于100且小于等于103 说明是坐标轴 此时我们就对物体的model矩阵进行变换
{
if (obID == 100)//如果点的是x轴
{
glm::vec3 temp = glm::vec3(off.x,0.0,0.0);
model[changeID] = glm::translate(model[changeID], glm::vec3(temp));
}
else if (obID == 102)//如果点的是y轴
{
glm::vec3 temp = glm::vec3(0.0,off.y,0.0);
model[changeID] = glm::translate(model[changeID], glm::vec3(temp));
}
else if (obID == 101)//如果点的是z轴
{
glm::vec3 temp = glm::vec3(0.0,0.0,off.z);
model[changeID] = glm::translate(model[changeID], glm::vec3(temp));
}
}