Рекурсия:: Как создать мини-вид трехмерного сценического комплекта себя поверх себя?
У меня есть 3D-мир с SceneKit, отлично работает, может панорамировать, увеличивать / уменьшать, но я хочу создать мини-вид на 3D-мир поверх большого 3D-мира. Поэтому, если пользователь приближается к очень точному разрешению, он все равно знает, где находится в космосе.
Большинство примеров, кажется, накладывают другой VC, такой как SpriteKit, поверх SceneKit VC с чем-то вроде overlaySKScene
, Мини-версия не увеличивает / уменьшает изображение, но будет панорамировать, менять освещение и т. Д., Но не будет принимать жесты. Это больше похоже на рекурсию того, как поставить мини-версию себя поверх себя.
2 ответа
Вот как я это сделал:
Вы можете просто добавить еще одну камеру на сцену и выполнить рендеринг в слой SCNLayer. Затем вы можете использовать этот слой внутри сцены в качестве материала или добавить его в качестве пользовательского вида поверх вашей сцены.
SCNScene *scene2 =[SCNScene scene];
// We duplicate the scene by cloning the root node.
// I found that you cannot share the scene if you
// use the layer within it.
[[scene2 rootNode] addChildNode:[root clone]];
// Create a SCNLayer, set the scene and size
SCNLayer *scnlayer = [SCNLayer layer];
scnlayer.scene = scene2;
scnlayer.frame = CGRectMake(0, 0, 600, 800);
// "Layer" should be the name of your second camera
scnlayer.pointOfView = [scene.rootNode childNodeWithName:@"Layer" recursively:YES];
// Make sure it gets updated
scnlayer.playing = YES;
// Make a parent layer with a black background
CALayer *backgroundLayer = [CALayer layer];
backgroundLayer.backgroundColor = CGColorGetConstantColor(kCGColorBlack);
backgroundLayer.frame = CGRectMake(0, 0, 600, 800);
// Add the SCNLayer
[backgroundLayer addSublayer:scnlayer];
// Set the layer as the emissive material of an object
SCNMaterial *material = plane.geometry.firstMaterial;
material.emission.contents = scnlayer;
Я уверен, что это не лучший способ сделать это, но у меня это сработало.
Есть несколько способов сделать это.
Вы можете просто добавить еще SCNView
поверх другого вида. Один SCNScene
может быть представлен несколькими видами, используя разные точки зрения.
Вы также можете использовать SCNTechnique
создать проход "мини-вид", который будет повторно визуализировать вашу сцену с другой точкой зрения во вспомогательной области просмотра.
В этом извлечении из SCNTechnique
Заголовок файла вы можете увидеть, что вы можете предоставить имя разыскиваемого pointOfView
:
sequence: ["Pass1", "Pass2", ...],
passes: {
"Pass1": {
outputs: <outputs>
inputs: <inputs>
draw: <draw command>
program: <program name>
colorStates: <color states>
depthStates: <depth states>
stencilStates: <stencil states>
cullMode: <cull mode>
blendStates: <blend states>
viewport: <custom viewport>
pointOfView: <node name> // Point of view
samples: <sample count>
excludeCategoryMask: <category bitMask>
includeCategoryMask: <category bitMask>
},
"Pass2" : {
[...]
}
}
Таким образом, добавив технику к вашему SCNScene
(соответствует SCNTechniqueSupport
) с DRAW_SCENE
пройти должен работать.