前言
还是找不到资料。。。。。。
还是,番外篇链接附上。
跟新速度会稍慢一些,因为我有项目要做,请各位看官不要着急哈~
开始
今天讲拾取
使用如下代码片即可。
其中用到的函数请参见:
pos = <pos>
world = <world>
max_dist = <max_dist>
def pick():
global pos,world,max_dist
_round = lambda x,y,z:(round(x),round(y),round(z))
x,y,z = pos
tx,ty,tz = target()
bx,by,bz = tx - x,ty - y,tz - z
dist = 0
while(dist < max_dist and _round(x,y,z) not in world):
x,y,z = x + bc,y + by,z + bz
if(dist == max_dist):
return (None,None,None)
else:
return _round(x,y,z)
其中,请替换:
<pos>
:摄像机位置<world>
:世界中物体的位置,列表,格式为[(x1,y1,z1),(x2,y2,z2),...]
<max_dist>
:最大拾取距离
另外,函数的返回值为拾取的位置,未拾取到返回(None,None,None)
由于没能找到资料,此处代码为拾取窗口正中央的方块,见图片
如果认真读了这篇文章,应该能知道target
函数是求在摄像机方向上,与摄像机距离为1的地方的坐标,所以我们就从摄像机位置
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)到
(
x
+
n
b
x
,
y
+
n
b
y
,
z
+
n
b
z
)
(x+nb_x,y+nb_y,z+nb_z)
(x+nbx,y+nby,z+nbz)(其中
b
x
b_x
bx、
b
y
b_y
by、
b
z
b_z
bz为target
函数的结果减去摄像机位置)枚举,如果有物体,拾取成功,没有,失败。
上述代码适合坐标是整数的,可以通过给 b x b_x bx、 b y b_y by、 b z b_z bz乘一个合适的小数达到适应小数坐标的目的。
牢骚
全网没一个讲pyopengl拾取的。。。。。。真奇怪
作者
hit-road
拜拜,下课!
回到顶部