#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 также предварительно выделяет указатель цвета до инициализации.