我试图以编程方式在Matlab中创建一个场景,为场景评估添加随机对象。我正在使用补丁对象进行显示,所以我有myObject.Faces = [data]
,myObject.Vertices = [data]
等行。如果我想在场景中添加点,我只需使用以下代码段附加新对象:
myScene.Vertices = [myScene.Vertices; myObject.Vertices];
myScene.Faces = [myScene.Faces; myObjects.Faces + numel(myScene.Faces)];
到目前为止,对于基本场景,一切都很好。当我希望能够在视觉上区分场景中的新对象时,我的问题出现了。我似乎无法为我单独添加到场景中的对象着色 - 一切都必须是相同的颜色。
我尝试使用repmat
创建一个与<var>.Faces
中的每个条目相对应的颜色条目,但是我收到Color value must be a 3 element numeric vector
的错误。
据我所知,我可以通过使用结构数组并循环遍历每个元素,但我希望避免这种情况。我有许多想要跟踪的对象,我想将场景称为myScene
,因此我可以使用patch(myScene)
进行绘图,因此可以在myScene.Vertices
上进行数学运算等。< / p>
我真的不想结束:
for i = 1:numel(myScene)
myScene(i).Vertices = <some function>(myScene(i).Vertices);
patch(myScene(i))
hold on
end
我每次都需要与myScene
进行互动,但同样,我希望场景中的不同对象也会有不同的颜色。
:编辑:
好的,对于极简单示例,请尝试以下方法:
sceneX = [-5 5 5 -5 5 -5];
sceneY = [5 5 -5 5 -5 -5];
sceneZ = [0 0 0 0 0 0];
scene.Vertices = [sceneX.',sceneY.',sceneZ.'];
nPoints = size(scene.Vertices,1);
scene.Faces = reshape(1:nPoints,3,nPoints/3).';
scene.FaceColor = [0.7 0.7 0.7];
patch(scene)
objectX = [-1 -1 1 -1 1 1 -1 -1 0 -1 0 1 0 1 1 -1 0 1];
objectY = [-1 1 1 -1 1 -1 -1 1 0 1 0 1 0 1 -1 -1 0 -1];
objectZ = [ 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 3 1];
object.Vertices = [objectX.',objectY.',objectZ.'];
nPoints = size(object.Vertices,1);
object.Faces = reshape(1:nPoints,3,nPoints/3).';
object.FaceColor = [0.3 0.3 0.7];
hold on
patch(object)
现在,正如我上面所写,我可以通过以下方式将object
添加到scene
:
newScene.Vertices = [scene.Vertices; object.Vertices];
newScene.Faces = [scene.Faces; object.Faces + numel(scene.Faces)];
然而,我无法保持颜色 - 据我所知,一切都必须设置为一种颜色。这是一个非常基本的例子;我实际生成的场景有数百个对象,每个对象有数百个面。
我正在寻找的内容:我将立即选择的答案是解释下面的方法(1),或解释为什么(1)不可能并提供如何做的答案(2)代替。
(1) - 解释如何使用newScene
命令的patch(FV)版本在patch
中为我自己指定的每组面部分配颜色。在上面的示例中,我希望newScene.Faces(1:2,:)
为一种颜色,newScene.Faces(3:end,:)
为另一种颜色。
(2) - 解释如何使用newScene
命令的任何变体在patch
中为我自己指定的每组面部分配颜色。
我有很多其他功能专门针对FV
结构,并且鉴于我的场景非常大,我不想跟踪/维护同一场景的两个重复条目。修改我的所有其他功能将是适度的痛苦,如果它是必需的,那么我想我必须这样做,但我想知道为什么如果需要我必须这样做。
答案 0 :(得分:1)
如果要为每个面指定颜色,则必须使用补丁属性FaceVertexCData
(可以在具有相同名称的字段的结构中定义),并设置FaceColor
至'Flat'
,如Coloring Patches文档中所述。
所以你的例子变成了:
%%
sceneX = [-5 5 5 -5 5 -5];
sceneY = [5 5 -5 5 -5 -5];
sceneZ = [0 0 0 0 0 0];
scene.Vertices = [sceneX.',sceneY.',sceneZ.'];
nPoints = size(scene.Vertices,1);
scene.Faces = reshape(1:nPoints,3,nPoints/3).';
scene.FaceColor = 'Flat' ;
scene.FaceVertexCData = repmat( [0.7 0.7 0.7] , size(scene.Faces,1) , 1 ) ; %// assign the same color for each face
patch(scene)
objectX = [-1 -1 1 -1 1 1 -1 -1 0 -1 0 1 0 1 1 -1 0 1];
objectY = [-1 1 1 -1 1 -1 -1 1 0 1 0 1 0 1 -1 -1 0 -1];
objectZ = [ 1 1 1 1 1 1 1 1 3 1 3 1 3 1 1 1 3 1];
object.Vertices = [objectX.',objectY.',objectZ.'];
nPoints = size(object.Vertices,1);
object.Faces = reshape(1:nPoints,3,nPoints/3).';
object.FaceColor = 'Flat' ;
object.FaceVertexCData = repmat( [0.3 0.3 0.7] , size(object.Faces,1) , 1 ) ; %// assign the same color for each face
hold on
patch(object)
%%
newScene.Vertices = [scene.Vertices ; object.Vertices];
newScene.Faces = [scene.Faces ; object.Faces + numel(scene.Faces)];
newScene.FaceVertexCData = [scene.FaceVertexCData ; object.FaceVertexCData ] ;
newScene.FaceColor = 'Flat' ;
patch(newScene)
现在,您的newScene
结构中有一个字段FaceVertexCData
,其中包含一个8x3
矩阵,表示每个面的颜色(scene
和下一个面的前两行object
)面的6行。您可以通过更改此矩阵的相应行来单独更改每个面部颜色。
如果要更改一个对象的颜色,则必须更改与该对象的面相对应的所有行,因此在添加时跟踪哪个面/行对应哪个对象可能会很好它们。