Делает ли » Буферная геометрия.атрибуты.цвет` в `three.js` поддерживаете шестнадцатеричный цвет?

#three.js #drake

Вопрос:

Я использую meshcat_python -библиотеку визуализации, построенную поверх three.js -для визуализации облаков точек. Цвет в настоящее время отправляется в виде nx3 массива поплавков, но для экономии пропускной способности я бы предпочел отправить массив n шестнадцатеричных триплетов. Однако мне так и не удалось заставить его работать.

Я начинаю с кода, который выглядит следующим образом:

 import numpy as np
import meshcat.geometry as g
from meshcat.servers.zmqserver import start_zmq_server_as_subprocess
from pydrake.all import ConnectMeshcatVisualizer, DiagramBuilder, AddMultibodyPlantSceneGraph

# pydrake code -- not important to the question, but here as a MRE
server_proc, zmq_url, web_url = start_zmq_server_as_subprocess()
builder = DiagramBuilder()
plant, scene_graph = AddMultibodyPlantSceneGraph(builder, time_step=1)
viz = ConnectMeshcatVisualizer(builder, scene_graph, zmq_url=zmq_url)

# point cloud visualization
n = 100
position = np.random.random((3, n))
color = np.random.random((3, n))
g_pc = g.PointCloud(position=position, color=color, size=0.1)

viz.vis.set_object(g_pc)

while True:
    pass
 

Это приводит three.js к результату g_pc.lower() , который в данном случае выглядит так:
{'metadata': {'version': 4.5, 'type': 'Object'}, 'geometries': [{'uuid': '0c16e79b-f62b-11eb-ba95-05197ba30d28', 'type': 'BufferGeometry', 'data': {'attributes': {'position': {'itemSize': 3, 'type': 'Float32Array', 'array': <umsgpack.Ext object at 0x7f1dd63b5970>, 'normalized': False}, 'color': {'itemSize': 1, 'type': 'Float32Array', 'array': <umsgpack.Ext object at 0x7f1dd63b5940>, 'normalized': False}}}}], 'materials': [{'uuid': '0c16e79c-f62b-11eb-ba95-05197ba30d28', 'type': 'PointsMaterial', 'color': 16777215, 'size': 0.01, 'vertexColors': 2}], 'object': {'uuid': '0c16e79d-f62b-11eb-ba95-05197ba30d28', 'type': 'Points', 'geometry': '0c16e79b-f62b-11eb-ba95-05197ba30d28', 'material': '0c16e79c-f62b-11eb-ba95-05197ba30d28', 'matrix': [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0]}} .

Это много текста, но, насколько я могу судить, соответствующая часть есть 'color': {'itemSize': 3, 'type': 'Float32Array', 'array': <umsgpack.Ext object at 0x7f1dd63b5940>, 'normalized': False} ; т. Е. Цвет-это nx3 массив по желанию.

Когда я пытаюсь:

 ...
color = np.ones(n) * 0x0000FF #blue
...
 

результат g_pc.lower() 'color': {'itemSize': 1, 'type': 'Float32Array', 'array': <umsgpack.Ext object at 0x7f1dd63b5940>, 'normalized': False} -массив формы n , по желанию.

Однако результирующая визуализация вся красная. На самом деле, насколько я могу судить, массив длины n всегда визуализируется так, как если бы он представлял красную составляющую цвета с плавающей запятой: т. Е. Красный канал визуализации-это массив, к которому прикреплен [0, 1] массив, а другие каналы равны нулю.

Я не уверен , связано ли это с meshcat или three.js , но я был бы признателен за предложения по любому из них: three.js BufferGeometry поддерживает ли шестнадцатеричный цвет вообще?

Ответ №1:

https://threejs.org/docs/#api/en/core/BufferGeometry

БуфергЕометрия по своей сути не предназначена для отображения. Часто можно было бы комбинировать буферную геометрию с материалом для создания сетки или точек… хотя материал может быть линейным или каркасным. Конечно, вам не нужно доводить дело до видимого результата. Вам не нужно добавлять какую-либо геометрию в сцену или использовать все созданные вами переменные. Возможно, на его свойства ссылаются косвенно. Атрибут цвета может быть назначен неправильно или заменять данные пользователя. Возможно, модифицированное репо с ТРЕМЯ репо использует Float32Array для правильного предварительного выделения системной оперативной памяти для шейдера MatLab или какой-то такой учебник по блогу?

Комментарии:

1. Я вижу-так похоже на этот пример github.com/mrdoob/three.js/blob/master/examples/… , где BufferGeometry используется только для хранения значений для THREE.Points объекта. Но это не полностью отвечает на вопрос-в этом примере также есть цвета в виде nx3 массива поплавков, и я не вижу никакого описания в документации ни BufferGeometry того, ни другого, ни Points для каких допустимых значений color ? Я также не смог найти в Интернете никаких примеров Points использования или BufferGeometry использования чего-либо, кроме цветов с плавающей точкой.

2. Ты ошибся с ТРОЙКОЙ? Цвет для Float32Array шейдера? Шейдер является более низкоуровневым, поэтому три документа не охватывают это подробно. Вероятно, в коде есть выделение, которое не комментируется. Строка 99 примера задает цвет(ы) точек. InstancedMesh также предварительно выделяет указатель цвета до инициализации.