open3d.t.geometry.TriangleMesh

class open3d.t.geometry.TriangleMesh

A triangle mesh contains vertices and triangles. The triangle mesh class stores the attribute data in key-value maps. There are two maps: the vertex attributes map, and the triangle attribute map.

The attributes of the triangle mesh have different levels:

import open3d as o3d

device = o3d.core.Device("CPU:0")
dtype_f = o3d.core.float32
dtype_i = o3d.core.int32

# Create an empty triangle mesh
# Use mesh.vertex to access the vertices' attributes
# Use mesh.triangle to access the triangles' attributes
mesh = o3d.t.geometry.TriangleMesh(device)

# Default attribute: vertex["positions"], triangle["indices"]
# These attributes is created by default and is required by all triangle
# meshes. The shape of both must be (N, 3). The device of "positions"
# determines the device of the triangle mesh.
mesh.vertex["positions"] = o3d.core.Tensor([[0, 0, 0],
                                            [0, 0, 1],
                                            [0, 1, 0],
                                            [0, 1, 1]], dtype_f, device)
mesh.triangle["indices"] = o3d.core.Tensor([[0, 1, 2],
                                            [0, 2, 3]]], dtype_i, device)

# Common attributes: vertex["colors"]  , vertex["normals"]
#                    triangle["colors"], triangle["normals"]
# Common attributes are used in built-in triangle mesh operations. The
# spellings must be correct. For example, if "normal" is used instead of
# "normals", some internal operations that expects "normals" will not work.
# "normals" and "colors" must have shape (N, 3) and must be on the same
# device as the triangle mesh.
mesh.vertex["normals"] = o3d.core.Tensor([[0, 0, 1],
                                          [0, 1, 0],
                                          [1, 0, 0],
                                          [1, 1, 1]], dtype_f, device)
mesh.vertex["colors"] = o3d.core.Tensor([[0.0, 0.0, 0.0],
                                         [0.1, 0.1, 0.1],
                                         [0.2, 0.2, 0.2],
                                         [0.3, 0.3, 0.3]], dtype_f, device)
mesh.triangle["normals"] = o3d.core.Tensor(...)
mesh.triangle["colors"] = o3d.core.Tensor(...)

# User-defined attributes
# You can also attach custom attributes. The value tensor must be on the
# same device as the triangle mesh. The are no restrictions on the shape and
# dtype, e.g.,
pcd.vertex["labels"] = o3d.core.Tensor(...)
pcd.triangle["features"] = o3d.core.Tensor(...)
__init__(*args, **kwargs)

Overloaded function.

  1. __init__(self: open3d.cpu.pybind.t.geometry.TriangleMesh, device: open3d.cpu.pybind.core.Device = CPU:0) -> None

Construct an empty trianglemesh on the provided device (default: ‘CPU:0’).

  1. __init__(self: open3d.cpu.pybind.t.geometry.TriangleMesh, vertex_positions: open3d.cpu.pybind.core.Tensor, triangle_indices: open3d.cpu.pybind.core.Tensor) -> None

boolean_difference(self: open3d.cpu.pybind.t.geometry.TriangleMesh, mesh: open3d.cpu.pybind.t.geometry.TriangleMesh, tolerance: float = 1e-06) → open3d.cpu.pybind.t.geometry.TriangleMesh

Computes the mesh that encompasses the volume after subtracting the volume of the second operand. Both meshes should be manifold.

This function always uses the CPU device.

Parameters
  • mesh (open3d.t.geometry.TriangleMesh) – This is the second operand for the boolean operation.

  • tolerance (float) – Threshold which determines when point distances are considered to be 0.

Returns

The mesh describing the difference volume.

Example

This subtracts the sphere from the cube volume:

box = o3d.geometry.TriangleMesh.create_box()
box = o3d.t.geometry.TriangleMesh.from_legacy(box)
sphere = o3d.geometry.TriangleMesh.create_sphere(0.8)
sphere = o3d.t.geometry.TriangleMesh.from_legacy(sphere)

ans = box.boolean_difference(sphere)

o3d.visualization.draw([{'name': 'difference', 'geometry': ans}])
boolean_intersection(self: open3d.cpu.pybind.t.geometry.TriangleMesh, mesh: open3d.cpu.pybind.t.geometry.TriangleMesh, tolerance: float = 1e-06) → open3d.cpu.pybind.t.geometry.TriangleMesh

Computes the mesh that encompasses the intersection of the volumes of two meshes. Both meshes should be manifold.

This function always uses the CPU device.

Parameters
  • mesh (open3d.t.geometry.TriangleMesh) – This is the second operand for the boolean operation.

  • tolerance (float) – Threshold which determines when point distances are considered to be 0.

Returns

The mesh describing the intersection volume.

Example

This copmutes the intersection of a sphere and a cube:

box = o3d.geometry.TriangleMesh.create_box()
box = o3d.t.geometry.TriangleMesh.from_legacy(box)
sphere = o3d.geometry.TriangleMesh.create_sphere(0.8)
sphere = o3d.t.geometry.TriangleMesh.from_legacy(sphere)

ans = box.boolean_intersection(sphere)

o3d.visualization.draw([{'name': 'intersection', 'geometry': ans}])
boolean_union(self: open3d.cpu.pybind.t.geometry.TriangleMesh, mesh: open3d.cpu.pybind.t.geometry.TriangleMesh, tolerance: float = 1e-06) → open3d.cpu.pybind.t.geometry.TriangleMesh

Computes the mesh that encompasses the union of the volumes of two meshes. Both meshes should be manifold.

This function always uses the CPU device.

Parameters
  • mesh (open3d.t.geometry.TriangleMesh) – This is the second operand for the boolean operation.

  • tolerance (float) – Threshold which determines when point distances are considered to be 0.

Returns

The mesh describing the union volume.

Example

This copmutes the union of a sphere and a cube:

box = o3d.geometry.TriangleMesh.create_box()
box = o3d.t.geometry.TriangleMesh.from_legacy(box)
sphere = o3d.geometry.TriangleMesh.create_sphere(0.8)
sphere = o3d.t.geometry.TriangleMesh.from_legacy(sphere)

ans = box.boolean_union(sphere)

o3d.visualization.draw([{'name': 'union', 'geometry': ans}])
clear(self)

Clear all elements in the geometry.

Returns

open3d.t.geometry.Geometry

clip_plane(self: open3d.cpu.pybind.t.geometry.TriangleMesh, point: open3d.cpu.pybind.core.Tensor, normal: open3d.cpu.pybind.core.Tensor) → open3d.cpu.pybind.t.geometry.TriangleMesh

Returns a new triangle mesh clipped with the plane.

This method clips the triangle mesh with the specified plane. Parts of the mesh on the positive side of the plane will be kept and triangles intersected by the plane will be cut.

Parameters
  • point (open3d.core.Tensor) – A point on the plane.

  • normal (open3d.core.Tensor) – The normal of the plane. The normal points to the positive side of the plane for which the geometry will be kept.

Returns

New triangle mesh clipped with the plane.

This example shows how to create a hemisphere from a sphere:

import open3d as o3d

sphere = o3d.t.geometry.TriangleMesh.from_legacy(o3d.geometry.TriangleMesh.create_sphere())
hemisphere = sphere.clip_plane(point=[0,0,0], normal=[1,0,0])

o3d.visualization.draw(hemisphere)
clone(self: open3d.cpu.pybind.t.geometry.TriangleMesh) → open3d.cpu.pybind.t.geometry.TriangleMesh

Returns copy of the triangle mesh on the same device.

compute_convex_hull(self: open3d.cpu.pybind.t.geometry.TriangleMesh, joggle_inputs: bool = False) → open3d.cpu.pybind.t.geometry.TriangleMesh

Compute the convex hull of a point cloud using qhull. This runs on the CPU.

Parameters
  • joggle_inputs (default False) –

  • perturbing the input data. Set to True if perturbing the input (randomly) –

  • acceptable but you need convex simplicial output. If False (iis) –

:param : :param neighboring facets may be merged in case of precision problems. See: :param `QHull docs <http: //www.qhull.org/html/qh-impre.htm#joggle`__ for more :param details.:

Returns

TriangleMesh representing the convexh hull. This contains an extra vertex property “point_indices” that contains the index of the corresponding vertex in the original mesh.

Example

We will load the Stanford Bunny dataset, compute and display it’s convex hull:

bunny = o3d.data.BunnyMesh()
mesh = o3d.t.geometry.TriangleMesh.from_legacy(o3d.io.read_triangle_mesh(bunny.path))
hull = mesh.compute_convex_hull()
o3d.visualization.draw([{'name': 'bunny', 'geometry': mesh}, {'name': 'convex hull', 'geometry': hull}])
cpu(self: open3d.cpu.pybind.t.geometry.TriangleMesh) → open3d.cpu.pybind.t.geometry.TriangleMesh

Transfer the triangle mesh to CPU. If the triangle mesh is already on CPU, no copy will be performed.

static create_arrow(cylinder_radius=1.0, cone_radius=1.5, cylinder_height=5.0, cone_height=4.0, resolution=20, cylinder_split=4, cone_split=1, float_dtype=Float32, int_dtype=Int64, device=CPU:0)

Create a arrow mesh.

Parameters
  • cylinder_radius (float, optional, default=1.0) – The radius of the cylinder.

  • cone_radius (float, optional, default=1.5) – The radius of the cone.

  • cylinder_height (float, optional, default=5.0) – The height of the cylinder. The cylinder is from (0, 0, 0) to (0, 0, cylinder_height)

  • cone_height (float, optional, default=4.0) – The height of the cone. The axis of the cone will be from (0, 0, cylinder_height) to (0, 0, cylinder_height + cone_height)

  • resolution (int, optional, default=20) – The cone will be split into resolution segments.

  • cylinder_split (int, optional, default=4) – The cylinder_height will be split into cylinder_split segments.

  • cone_split (int, optional, default=1) – The cone_height will be split into cone_split segments.

  • float_dtype (open3d.core.Dtype, optional, default=Float32) – Float_dtype, Float32 or Float64.

  • int_dtype (open3d.core.Dtype, optional, default=Int64) – Int_dtype, Int32 or Int64.

  • (open3d.core.Device (device) – 0): Device of the create octahedron.

  • optional – 0): Device of the create octahedron.

  • default=CPU – 0): Device of the create octahedron.

Returns

open3d.t.geometry.TriangleMesh

static create_box(height=1.0, depth=1.0, float_dtype=Float32, int_dtype=Int64, device=CPU:0)
Parameters
  • height (float, optional, default=1.0) – y-directional length.

  • depth (float, optional, default=1.0) – z-directional length.

  • float_dtype (open3d.core.Dtype, optional, default=Float32) – Float_dtype, Float32 or Float64.

  • int_dtype (open3d.core.Dtype, optional, default=Int64) – Int_dtype, Int32 or Int64.

  • (open3d.core.Device (device) – 0): Device of the create mesh.

  • optional – 0): Device of the create mesh.

  • default=CPU – 0): Device of the create mesh.

Returns

open3d.t.geometry.TriangleMesh

static create_cone(radius=1.0, height=2.0, resolution=20, split=1, float_dtype=Float32, int_dtype=Int64, device=CPU:0)

Create a cone mesh.

Parameters
  • radius (float, optional, default=1.0) – The radius of the cone.

  • height (float, optional, default=2.0) – The height of the cone. The axis of the cone will be from (0, 0, 0) to (0, 0, height).

  • resolution (int, optional, default=20) – The circle will be split into resolution segments

  • split (int, optional, default=1) – The height will be split into split segments.

  • float_dtype (open3d.core.Dtype, optional, default=Float32) – Float_dtype, Float32 or Float64.

  • int_dtype (open3d.core.Dtype, optional, default=Int64) – Int_dtype, Int32 or Int64.

  • (open3d.core.Device (device) – 0): Device of the create octahedron.

  • optional – 0): Device of the create octahedron.

  • default=CPU – 0): Device of the create octahedron.

Returns

open3d.t.geometry.TriangleMesh

static create_coordinate_frame(size=1.0, origin=array([0., 0., 0.]), float_dtype=Float32, int_dtype=Int64, device=CPU:0)

Create a coordinate frame mesh.

Parameters
  • size (float, optional, default=1.0) – The size of the coordinate frame.

  • origin (numpy.ndarray[numpy.float64[3, 1]], optional, default=array([0., 0., 0.])) – The origin of the coordinate frame.

  • float_dtype (open3d.core.Dtype, optional, default=Float32) – Float_dtype, Float32 or Float64.

  • int_dtype (open3d.core.Dtype, optional, default=Int64) – Int_dtype, Int32 or Int64.

  • (open3d.core.Device (device) – 0): Device of the create octahedron.

  • optional – 0): Device of the create octahedron.

  • default=CPU – 0): Device of the create octahedron.

Returns

open3d.t.geometry.TriangleMesh

static create_cylinder(radius=1.0, height=2.0, resolution=20, split=4, float_dtype=Float32, int_dtype=Int64, device=CPU:0)

Create a cylinder mesh.

Parameters
  • radius (float, optional, default=1.0) – The radius of the cylinder.

  • height (float, optional, default=2.0) – The height of the cylinder.The axis of the cylinder will be from (0, 0, -height/2) to (0, 0, height/2).

  • resolution (int, optional, default=20) – The circle will be split into resolution segments

  • split (int, optional, default=4) – The height will be split into split segments.

  • float_dtype (open3d.core.Dtype, optional, default=Float32) – Float_dtype, Float32 or Float64.

  • int_dtype (open3d.core.Dtype, optional, default=Int64) – Int_dtype, Int32 or Int64.

  • (open3d.core.Device (device) – 0): Device of the create octahedron.

  • optional – 0): Device of the create octahedron.

  • default=CPU – 0): Device of the create octahedron.

Returns

open3d.t.geometry.TriangleMesh

static create_icosahedron(radius=1.0, float_dtype=Float32, int_dtype=Int64, device=CPU:0)

Create a icosahedron mesh centered at (0, 0, 0).

Parameters
  • radius (float, optional, default=1.0) – Distance from centroid to mesh vetices.

  • float_dtype (open3d.core.Dtype, optional, default=Float32) – Float_dtype, Float32 or Float64.

  • int_dtype (open3d.core.Dtype, optional, default=Int64) – Int_dtype, Int32 or Int64.

  • (open3d.core.Device (device) – 0): Device of the create octahedron.

  • optional – 0): Device of the create octahedron.

  • default=CPU – 0): Device of the create octahedron.

Returns

open3d.t.geometry.TriangleMesh

static create_mobius(length_split=70, width_split=15, twists=1, raidus=1, flatness=1, width=1, scale=1, float_dtype=Float32, int_dtype=Int64, device=CPU:0)

Create a Mobius strip.

Parameters
  • length_split (int, optional, default=70) – The number of segments along the Mobius strip.

  • width_split (int, optional, default=15) – The number of segments along the width of the Mobius strip.

  • twists (int, optional, default=1) – Number of twists of the Mobius strip.

  • raidus (float, optional, default=1) –

  • flatness (float, optional, default=1) – Controls the flatness/height of the Mobius strip.

  • width (float, optional, default=1) – Width of the Mobius strip.

  • scale (float, optional, default=1) – Scale the complete Mobius strip.

  • float_dtype (open3d.core.Dtype, optional, default=Float32) – Float_dtype, Float32 or Float64.

  • int_dtype (open3d.core.Dtype, optional, default=Int64) – Int_dtype, Int32 or Int64.

  • (open3d.core.Device (device) – 0): Device of the create octahedron.

  • optional – 0): Device of the create octahedron.

  • default=CPU – 0): Device of the create octahedron.

Returns

open3d.t.geometry.TriangleMesh

static create_octahedron(radius=1.0, float_dtype=Float32, int_dtype=Int64, device=CPU:0)

Create a octahedron mesh centered at (0, 0, 0).

Parameters
  • radius (float, optional, default=1.0) – Distance from centroid to mesh vetices.

  • float_dtype (open3d.core.Dtype, optional, default=Float32) – Float_dtype, Float32 or Float64.

  • int_dtype (open3d.core.Dtype, optional, default=Int64) – Int_dtype, Int32 or Int64.

  • (open3d.core.Device (device) – 0): Device of the create octahedron.

  • optional – 0): Device of the create octahedron.

  • default=CPU – 0): Device of the create octahedron.

Returns

open3d.t.geometry.TriangleMesh

static create_sphere(radius=1.0, resolution=20, float_dtype=Float32, int_dtype=Int64, device=CPU:0)

Create a sphere mesh centered at (0, 0, 0).

Parameters
  • radius (float, optional, default=1.0) – The radius of the sphere.

  • resolution (int, optional, default=20) – The resolution of the sphere.

  • float_dtype (open3d.core.Dtype, optional, default=Float32) – Float_dtype, Float32 or Float64.

  • int_dtype (open3d.core.Dtype, optional, default=Int64) – Int_dtype, Int32 or Int64.

  • (open3d.core.Device (device) – 0): Device of the create sphere.

  • optional – 0): Device of the create sphere.

  • default=CPU – 0): Device of the create sphere.

Returns

open3d.t.geometry.TriangleMesh

static create_tetrahedron(radius=1.0, float_dtype=Float32, int_dtype=Int64, device=CPU:0)

Create a tetrahedron mesh centered at (0, 0, 0).

Parameters
  • radius (float, optional, default=1.0) – Distance from centroid to mesh vetices.

  • float_dtype (open3d.core.Dtype, optional, default=Float32) – Float_dtype, Float32 or Float64.

  • int_dtype (open3d.core.Dtype, optional, default=Int64) – Int_dtype, Int32 or Int64.

  • (open3d.core.Device (device) – 0): Device of the create tetrahedron.

  • optional – 0): Device of the create tetrahedron.

  • default=CPU – 0): Device of the create tetrahedron.

Returns

open3d.t.geometry.TriangleMesh

static create_text(text: str, depth: float = 0.0, float_dtype: open3d.cpu.pybind.core.Dtype = Float32, int_dtype: open3d.cpu.pybind.core.Dtype = Int64, device: open3d.cpu.pybind.core.Device = CPU:0) → open3d.cpu.pybind.t.geometry.TriangleMesh

Create a triangle mesh from a text string.

Parameters
  • text (str) – The text for generating the mesh. ASCII characters 32-126 are supported (includes alphanumeric characters and punctuation). In addition the line feed ‘n’ is supported to start a new line.

  • depth (float) – The depth of the generated mesh. If depth is 0 then a flat mesh will be generated.

  • float_dtype (o3d.core.Dtype) – Float type for the vertices. Either Float32 or Float64.

  • int_dtype (o3d.core.Dtype) – Int type for the triangle indices. Either Int32 or Int64.

  • device (o3d.core.Device) – The device for the returned mesh.

Returns

Text as triangle mesh.

Example

This shows how to simplifify the Stanford Bunny mesh:

import open3d as o3d

mesh = o3d.t.geometry.TriangleMesh.create_text('Open3D', depth=1)
o3d.visualization.draw([{'name': 'text', 'geometry': mesh}])
static create_torus(torus_radius=1.0, tube_radius=0.5, radial_resolution=30, tubular_resolution=20, float_dtype=Float32, int_dtype=Int64, device=CPU:0)

Create a torus mesh.

Parameters
  • torus_radius (float, optional, default=1.0) – The radius from the center of the torus to the center of the tube.

  • tube_radius (float, optional, default=0.5) – The radius of the torus tube.

  • radial_resolution (int, optional, default=30) – The number of segments along the radial direction.

  • tubular_resolution (int, optional, default=20) – The number of segments along the tubular direction.

  • float_dtype (open3d.core.Dtype, optional, default=Float32) – Float_dtype, Float32 or Float64.

  • int_dtype (open3d.core.Dtype, optional, default=Int64) – Int_dtype, Int32 or Int64.

  • (open3d.core.Device (device) – 0): Device of the create octahedron.

  • optional – 0): Device of the create octahedron.

  • default=CPU – 0): Device of the create octahedron.

Returns

open3d.t.geometry.TriangleMesh

cuda(self: open3d.cpu.pybind.t.geometry.TriangleMesh, device_id: int = 0) → open3d.cpu.pybind.t.geometry.TriangleMesh

Transfer the triangle mesh to a CUDA device. If the triangle mesh is already on the specified CUDA device, no copy will be performed.

fill_holes(self: open3d.cpu.pybind.t.geometry.TriangleMesh, hole_size: float = 1000000.0) → open3d.cpu.pybind.t.geometry.TriangleMesh

Fill holes by triangulating boundary edges.

This function always uses the CPU device.

Parameters

hole_size (float) – This is the approximate threshold for filling holes. The value describes the maximum radius of holes to be filled.

Returns

New mesh after filling holes.

Example

Fill holes at the bottom of the Stanford Bunny mesh:

bunny = o3d.data.BunnyMesh()
mesh = o3d.t.geometry.TriangleMesh.from_legacy(o3d.io.read_triangle_mesh(bunny.path))
filled = mesh.fill_holes()
o3d.visualization.draw([{'name': 'filled', 'geometry': ans}])
static from_legacy(mesh_legacy: open3d.cpu.pybind.geometry.TriangleMesh, vertex_dtype: open3d.cpu.pybind.core.Dtype = Float32, triangle_dtype: open3d.cpu.pybind.core.Dtype = Int64, device: open3d.cpu.pybind.core.Device = CPU:0) → open3d.cpu.pybind.t.geometry.TriangleMesh

Create a TriangleMesh from a legacy Open3D TriangleMesh.

get_axis_aligned_bounding_box(self: open3d.cpu.pybind.t.geometry.TriangleMesh) → open3d::t::geometry::AxisAlignedBoundingBox

Create an axis-aligned bounding box from vertex attribute ‘positions’.

get_center(self: open3d.cpu.pybind.t.geometry.TriangleMesh) → open3d.cpu.pybind.core.Tensor

Returns the center for point coordinates.

get_max_bound(self: open3d.cpu.pybind.t.geometry.TriangleMesh) → open3d.cpu.pybind.core.Tensor

Returns the max bound for point coordinates.

get_min_bound(self: open3d.cpu.pybind.t.geometry.TriangleMesh) → open3d.cpu.pybind.core.Tensor

Returns the min bound for point coordinates.

has_valid_material(self: open3d.cpu.pybind.t.geometry.DrawableGeometry) → bool

Returns true if the geometry’s material is valid.

is_empty(self)

Returns True iff the geometry is empty.

Returns

bool

rotate(self: open3d.cpu.pybind.t.geometry.TriangleMesh, R: open3d.cpu.pybind.core.Tensor, center: open3d.cpu.pybind.core.Tensor) → open3d.cpu.pybind.t.geometry.TriangleMesh

Rotate points and normals (if exist).

scale(self: open3d.cpu.pybind.t.geometry.TriangleMesh, scale: float, center: open3d.cpu.pybind.core.Tensor) → open3d.cpu.pybind.t.geometry.TriangleMesh

Scale points.

simplify_quadric_decimation(self: open3d.cpu.pybind.t.geometry.TriangleMesh, target_reduction: float, preserve_volume: bool = True) → open3d.cpu.pybind.t.geometry.TriangleMesh

Function to simplify mesh using Quadric Error Metric Decimation by Garland and Heckbert.

This function always uses the CPU device.

Parameters
  • target_reduction (float) – The factor of triangles to delete, i.e., setting this to 0.9 will return a mesh with about 10% of the original triangle count. It is not guaranteed that the target reduction factor will be reached.

  • preserve_volume (bool) – If set to True this enables volume preservation which reduces the error in triangle normal direction.

Returns

Simplified TriangleMesh.

Example

This shows how to simplifify the Stanford Bunny mesh:

bunny = o3d.data.BunnyMesh()
mesh = o3d.t.geometry.TriangleMesh.from_legacy(o3d.io.read_triangle_mesh(bunny.path))
simplified = mesh.simplify_quadric_decimation(0.99)
o3d.visualization.draw([{'name': 'bunny', 'geometry': simplified}])
to(self: open3d.cpu.pybind.t.geometry.TriangleMesh, device: open3d.cpu.pybind.core.Device, copy: bool = False) → open3d.cpu.pybind.t.geometry.TriangleMesh

Transfer the triangle mesh to a specified device.

to_legacy(self: open3d.cpu.pybind.t.geometry.TriangleMesh) → open3d.cpu.pybind.geometry.TriangleMesh

Convert to a legacy Open3D TriangleMesh.

transform(self: open3d.cpu.pybind.t.geometry.TriangleMesh, transformation: open3d.cpu.pybind.core.Tensor) → open3d.cpu.pybind.t.geometry.TriangleMesh

Transforms the points and normals (if exist).

translate(self: open3d.cpu.pybind.t.geometry.TriangleMesh, translation: open3d.cpu.pybind.core.Tensor, relative: bool = True) → open3d.cpu.pybind.t.geometry.TriangleMesh

Translates points.

property device

Returns the device of the geometry.

property is_cpu

Returns true if the geometry is on CPU.

property is_cuda

Returns true if the geometry is on CUDA.

property material
property triangle
property vertex