打印 .obj 文件最高点的坐标?

Print the coordinates of the highest point of an .obj file?

我从来没有用 Python 处理过 3D 对象,所以我觉得有点迷茫。

我想知道是否可以创建一个程序来检测 3D 对象(.obj 格式)的最高点并给出它们的坐标。

我有一个关于比较 3D 对象的每个点并且只 return 最高点的坐标的想法。

我将不胜感激任何帮助,即使只是告诉我在哪里看。


编辑:我创建了一个 return 对象最大高度的程序。

它有效,但我如何才能使它 return 不仅是最高点的最大高度,而且是它沿另一轴的坐标?

例如,它会return:最高点在 5.04 米处。它的坐标是(xxx, xxx, 5.04)。有没有办法打印给定点的坐标?

编辑 2:这是我的实际代码。它 returns .obj 的最大高度。我想return最高点的3轴坐标

是否可以不将此代码应用于整个对象,而只应用于其中的一部分? (例如:在 x 轴和 y 轴上的精确间隔之间检测 z 上的最高点?)我不知道如何使用 python

处理坐标
import sys

filename = 'test2.obj'  # sys.argv[1]

x, y, z = [], [], []

with open(filename) as f:
for line in f:
    line = line[:-1].split(' ')
    if line[0] == 'v':
        y.append(float(line[2]))

print('height max = ' + str(max(y)) +  ' m')

input()

EDIT 2: Here is my actual code. It returns the maximum height of a .obj. I would like it to return the 3-axis coordinates of the highest point.

在您的代码中,您仅附加到列表 y。您还需要附加到相应的 xy 列表。然后,您可以在 y 列表中找到最大值的索引,然后索引到具有相同索引的 xz 列表。

将 x、y 和 z 值保存在单独的列表中有点麻烦。考虑将它们放在 namedtuple 中。然后你需要的只是这些命名元组的一个列表。

将此作为您的输入文件:

v 10.307 4.083 4.905
v 1.920 11.778 13.118
v 7.883 17.747 0.258
v 5.085 0.353 10.356
v 8.999 9.146 8.047

代码:

import sys
from collections import namedtuple

Point = namedtuple('Point', 'x y z')
points = []
filename = 'test2.obj'  # sys.argv[1]

with open(filename) as f:
    for line in f:
        line = line[:-1].split(' ')
        if line[0] == 'v':
            x, y, z = map(float, line[1:])
            points.append(Point(x, y, z))

highest_point = max(points, key=lambda point: point.z)
print('Highest point on the z-axis:', highest_point)
print(highest_point.x, highest_point.y, highest_point.z)

输出:

Highest point on the z-axis: Point(x=1.92, y=11.778, z=13.118)
1.92 11.778 13.118

max() 采用关键字参数 key,在这种情况下,它允许您对 z 属性进行比较,而不是 Point namedtuple.

Could it be possible to apply this code not to the entire object, but only to a part of it? (example: detect the highest point on z between a precise interval on the x and y axis?)

当然可以。在找到最大点之前,过滤列表,使其只包含区间内的点。例如:

filtered_points = []
for point in points:
    if 9 > point.x > 3 and 10 > point.y > 5:
        filtered_points.append(point)

highest_point = max(filtered_points, key=lambda point: point.z)
print('Highest point on the z-axis between some interval on the x and y axis:', highest_point)

输出:

Highest point on the z-axis between some interval on the x and y axis: Point(x=8.999, y=9.146, z=8.04)