Skip to content

Latest commit

 

History

History
213 lines (159 loc) · 9.42 KB

README-ru.md

File metadata and controls

213 lines (159 loc) · 9.42 KB

EN | RU

< Назад Начало Далее >
02. Мышь Самоучители 04. Выбор узла

03. Сферы

В этом самоучителе мы отобразим сферы.

Ориентировочное время выполнения: 10 минут.

Содержание

Давайте отобразим одну сферу:

local nodes = main.application.nodes

local sphere = nodes:createSphere("sphere", 1)
local root = nodes:node("root")
root:addChild(sphere)

Запустить в ogse

Взглянем на новый использованный нами API:

  • main.application.nodes (экземпляр) содержит узлы сцены (необязательно видимые) класса scene.Node
  • main.application.nodes:createSphere() (метод)
    • принимает название сферы (узла) и её радиус
    • возвращает новый экземпляр scene.Node, представляющий сферу
      local sphere = main.application.nodes:createSphere("sphere", 1)
  • main.application.nodes:node() (метод)
    • принимает название искомого узла среди узлов сцены, содержащися экземпляром main.application.nodes
    • возвращает либо уже существующий экземпляр scene.Node, либо nil в противном случае
      local node = main.application.nodes:node("sphere")
      if (node)
      then
          print("Node exists")
      else
          print("Node does not exist")
      end
  • scene (пространство имён) содержит функциональность управления графом сцены
  • scene.Node:addChild() (метод)
    • принимает экземпляр scene.Node для присоединения его в качестве дочернего узла
      local parent = main.application.nodes:node("parent")
      local child = main.application.nodes:node("child")
      parent:addChild(child)

Замечания:

  • названия узлов сцены должны быть уникальны
  • узел root создаётся ogs и служит корнем для видимых узлов сцены
  • лишь те узлы видимы, которые в начале своей иерархии графа сцены имеют root

Давайте отобразим другую сферу справа от текущей.

Добавьте следующий код:

local sphereRight = nodes:createSphere("another", 1)
root:addChild(sphereRight)
sphereRight.position = {2, 0, 0}

Запустить в ogse

Взглянем на новый использованный нами API:

  • scene.Node.position (свойство)
    • принимает массив компонент позиции в формате XYZ
      node.position = {2, 0, 0}
    • возвращает массив компонент позиции в формате XYZ
      local pos = node.position
      print("Node position:", pos[1], pos[2], pos[3])

Возможно, вы уже заметили пару странных вещей:

  • sphereRight находится слева
  • видна лишь часть сферы

Эти проблемы возникли из-за того, что камера сама выбрала себе позицию. Давайте посмотрим, каковы текущие позиция и вращение камеры.

Добавьте следующий код:

local camera = main.application.camera

local pos = camera.position
print("Camera position:", pos[1], pos[2], pos[3])
local rot = camera.rotation
print("Camera rotation:", rot[1], rot[2], rot[3])

Запустить в ogse

Взглянем на новый использованный нами API:

  • main.application.camera.position (свойство)
    • принимает массив компонент позиции в формате XYZ
      main.application.camera.position = {0, -30, 0}
    • возвращает массив компонент позиции в формате XYZ
      local pos = main.application.camera.position
      print("Camera position:", pos[1], pos[2], pos[3])
  • main.application.camera.rotation (свойство)
    • принимает массив компонент вращения в градусах XYZ
      main.application.camera.rotation = {90, 0, 0}
    • возвращает массив компонент вращения в градусах XYZ
      local rot = main.application.camera.rotation
      print("Camera rotation:", rot[1], rot[2], rot[3])

Консоль отладки должна содержать теперь что-то вроде:

Camera position:    0.000000    3.974028    0.000000
Camera rotation:    90.000000   0.000000    180.000000

Довольно интересная ориентация камеры, не так ли?

Возможно, вы решили, что установка вращения камеры в 0, 0, 0 поместит sphereRight справа. Тем не менее, одного вращения не хватит, чтобы улучшить вид сцены. На самом деле, нам нужна следующая ориентация камеры:

  • позиция: 0, -30, 0
  • вращение: 90, 0, 0

Честно говоря, мы пришли к этим значениям благодаря экспериментам, у нас нет логического объяснения этих значений. Извиняйте.

Давайте теперь отобразим обе сферы таким образом, чтобы они были отчётливо видны. Вот полный код:

local nodes = main.application.nodes

local sphere = nodes:createSphere("sphere", 1)
local root = nodes:node("root")
root:addChild(sphere)

local sphereRight = nodes:createSphere("another", 1)
root:addChild(sphereRight)
sphereRight.position = {2, 0, 0}

local camera = main.application.camera

camera.position = {0, -30, 0}
camera.rotation = {90, 0, 0}

Запустить в ogse

Теперь sphereRight находится справа от первоначальной сферы.

Вы успешно отобразили сферы, позиционировали одну из них, а затем улучшили угол обзора с помощью ориентации камеры.

< Назад Начало Далее >
02. Мышь Самоучители 04. Выбор узла