最近一直在学习unity,在制作游戏的过程中碰到,轴怎么移动的问题,我在facebook上找到了

答案,你可以在3dmax和maya上把轴线移动到你想要的位置,然后导入到unity中,这样就可以了。

下面是最近3d图形学的一个作业,就是实现鼠标拾取的操作。

在实现这个的过程中开始一直矛盾于如何把windows坐标转换成opengl坐标,因为我们知道windows坐标的原点是在左上角,而opengl是在左下角。

在程序中一直用POINT  iscreen,     ::GetCursorPos(&iscreen)来获取窗口坐标,但是几次试验之后不行,不知道怎么转成opengl视口的坐标。后来在红宝书的例子指引下我才发现我走上了一条不归路。在opengl中,有个库函数可以轻松的实现,那就是glutMouseFunc(pickRects);这里的pickRects是一个函数,参数为(int button,int state,int x, int y)

我一直纠结于那个glutMouseFunc(pickRects)函数没有给括号中的函数赋值,就这样调用可以吗?实际的结果就是可以的,因为这就是库函数自动的把鼠标的坐标值付给那个函数中去。下面这个函数就可以确定一个拾取的范围,就是gluPickMatrix((GLdouble) x,(GLdouble )(viewport[3]-y),5.0,5.0,viewport)。前两个函数就是把世界坐标(x,y)转换成opengl坐标。后面的(5.0,5.0)是对拾取窗口的大小的表述、viewport是个四维的数组,用glGetIntegerv(GL_VIEWPORT,viewport)来给其赋值。现在是opengl的屏幕坐标不用纠结了。

下面关于名字栈就又开始犯迷糊了。

名字是对三维物体的一个命名,那个名字栈中究竟存在什么呢?使用名字栈之前必须先用一个数组来当做selectbuffer该缓存就是来存储并选中物体的信息的。因而要首先建立。

被选中物体的数量(通常为1)

 

被选中物体的最小深度值

 

被选中物体的最大深度值

 

被选物体的名字(通常以常数来命名)

 

变选中物体的数量(通常为1)

 

被选中物体的最小深度值

 

被选中物体的最大深度值

………… …………

 

这就是selectbuffer的内容

       当如果是multiple name时候,被选中物体的数量就会大于1,但是还是没有弄清楚啥意思?如果有知道可以给我留言啊。

被选中物体的最小深度值,最大深度值是乘以0x7fffffff之后才存储到buffer缓存中的,因此在选中之后的读取过程中就要除以该数值,我看到许多博客上写的是0xffffffff,我不知道为啥?但是红宝书第七版第622页就是这样写的,经过编程序也是正确的。

那个hits=glRenderMode(GL-RENDER),就是返回鼠标拾取的个数,如果鼠标击中一个无重叠的物体,则hits值为1,如果是两个重叠的交汇处则hits值为2,如此类推…………。这个函数的功能除此之外还是结束GL_SELECT的模式的功能。要想对选中的物体进行操作就该进入feedback模式下进行工作。

这点解决了


接下来就是出现只有一个物体能被选中,其他物体都显示不出来。一直着急的不行,后来才发现在画的过程中用到了一些PopMatrix()和PushMatrix()等等把自己整迷糊了。我后来就都删了,直接画,注意一下尺寸的问题,最后显示出来了。所以有些东西自己不是很理解的时候千万不能乱用,用错了都不知道自己是死在什么沟沟里?

接下来上图

unity怎么进行顶点偏移 unity怎么移动轴点_拾取操作的总结

unity怎么进行顶点偏移 unity怎么移动轴点_unity怎么进行顶点偏移_02





点击没有重叠的黄色的图片就是出现在命令行窗口,你鼠标拾取那个物体,物体的深度值。

如果点击三个图形的交界处就会出现如下图所示

unity怎么进行顶点偏移 unity怎么移动轴点_unity怎么进行顶点偏移_03

击中了三个物体,从前到后一次是物体1,物体2,物体3.

费了九牛二虎之力终于完成作业了,有点激动,把红宝书代码奉上,共享