python 3d游戏 源码_使用Python探索3D点云处理——案例:一座3D文物雕像

需要建立一个python环境(要是觉得麻烦直接使用PyCharm也可以,能实现就行,如果是小白就按部就班往下看)。

建议下载Anaconda Navigator,它带有一个简单的GUI功能。

下载并安装后,创建一个环境(左侧的第二个选项卡>“创建”按钮),该环境允许您指定python版本(最好使用最新版本)。

Anaconda GUI —通过具有不同库/ Python版本的环境管理独立项目

创建后,您可以链接所需的库而不会发生冲突。为此,只需搜索已安装软件包中的软件包(例如NumPy,Matplotlib),如果未弹出,则选择“未安装”,选中它们并单击“应用”以安装它们。

Numpy和Matplotlib是必须的python标准库。

在conda库包管理器中搜索库即可

以上差不多完成了设置,现在回到Anaconda主页选项卡,确保您在正确的环境中使用它(XXX上的应用程序),然后可以将Spyder安装为IDE(集成开发环境)以启动代码项目。

注意:Spyder是任何不熟悉python编码的业余爱好者的最佳工具之一。另一个出色的工具是Jupyter,它在将交互代码呈现给高级管理层,以实现更好的可视化。

安装完成后,您就可以准备启动Spyder。

虽然GUI可能允许直接获得结果的几种可能性,但首先的编写步骤应该为:

建立脚本(1),执行脚本(2),然后在控制台中探索+与结果的交互(3)。

Spyder Python界面的3个基本元素

在下面实验中,我们将使用采样点云,数据集我已经搜集到,感兴趣的转发文章或者赞赏2.5元即可获得(数据集较大,我下载了好久才下载完)

数据集来自下面的雕像3D采样

这是来自Glyptotek博物馆在哥本哈根(这是在Google白嫖到的)的一座雕像图。

下面开始”干“

在Sypder中,开始使用一个非常强大的库:NumPy:源码如下:

import numpy as npfile_data_path=”数据集存储位置.xyz”point_cloud= np.loadtxt(file_data_path, skiprows=1, max_rows=1000000)

步骤:(1)导入库NumP;(2)创建一个变量,该变量包含指向包含这些数据集的文件和字符串;(3)将点云导入为名为point_cloud的变量,跳过第一行(例如,保留点数),并设置最大行数以运行测试而不会出现内存不足的情况。

现在,您可以通过直接在控制台中进行编写来访问保存数据的实体的第一点(point_cloud):

In:point_cloud [0]

然后,您将获得一个包含第一个点(坐标)的内容的数组,在本例中为X,Y和Z坐标。

Out:array([0.480,1.636,1.085])

这些是您使用python和点云的第一步。现在您知道了如何加载点数据了吧,让我们看一些有趣的过程。

首先,我们有一个具有6个属性的点云:X,Y,Z,R,G,B。需要注意的是,在使用NumPy数组时,索引始终从0开始。因此,如果加载时不带字段名,则得到第二点:

In:point_cloud [1]Out:array([ 0.480,1.636,1.085,25,44,68 ])

如果要从此处获取Red(R)属性(NumPy“列”索引为3),则可以执行以下操作:

In:point_cloud [1] [3]Out:14

如果要提取点云中所有点的Z属性:

In:point_cloud [:,1]Out:array([2.703,2.716,2.712,…,2.759,2.741,2.767])

如果我们只想提取所有点的X,Y,Z属性:

In:point_cloud [:,:3]Out:array([[4.933,2.703,2.194],[ 4.908,2.716,2.178],[ 4.92,2.712,2.175],…,[5.203,2.759,0.335],[5.211 ,2.741,0.399 ],[5.191,2.767,0.279]]

)

如果每个结果要多次使用,则可以将它们存储在变量中:

xyz = point_cloud [:,:3]rgb = point_cloud [:,3:]

现在让我们看一些有用的分析。如果您想知道点云的平均高度,则可以轻松地执行以下操作:

In:np.mean(point_cloud,axis = 0)[2]Out:2.6785763

提示:这里,设置为0的轴要求独立查看每个“列”。如果忽略,则均值将在所有值上运行;如果设置为1,则每行将取平均值。

如果现在要提取距离平均高度1米的缓冲区内的点(我们假设该值存储在mean_Z中):

In:point_cloud [abs(point_cloud [:,2] -mean_Z)<1]Out:array([…])

下面进行可视化环节:对于第一个3D点云绘图经验,我将动手操作一个基本库:Matplotlib

import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits import mplot3d

导入的依赖项的行为如下:

numpy

matplotlib.pyplot处理绘图

mpl_toolkits.mplot3d允许创建3D投影

在这里,我们可以添加之前探索的代码:

根据过滤初始点云的空间查询,您将获得4个变量(xyz和rgb)。现在开始研究如何简单地绘制文章开头的gif3D图。首先,创建一个3d轴对象。为此,我们传递projection='3d'给plt.axes,它返回一个Axes3DSubplot对象。

ax = plt.axes(projection='3d')

正如你所看到的,传递给坐标x,y,到z的xyz[:,0],xyz[:,1],xyz[:,2]函数;可以通过归一化为[0:1]间隔除以最大值得到的;此外,每个点的颜色通过c = rgb/255得到,并且屏幕上每个点的大小为s = 0.01。

补充以下源码即可画出点云图

ax = plt.axes(projection='3d')ax.scatter(xyz[:,0], xyz[:,1], xyz[:,2], color= rgb/255, s=0.01)plt.show()

最后,我们来看看可视化效果:

你可能感兴趣的:(python,3d游戏,源码)