Автор Тема: CopperCube  (Прочитано 46323 раз)

Оффлайн Samovar

  • Житель
Re: CopperCube
« Ответ #45 : 04 Май 2019, 19:43:25 »
Создание сценария поведения с помощью JavaScript

Вы можете создавать свои собственные поведения в CopperCube, используя JavaScript. И они будут работать так же, как встроенные. В этом уроке рассказано, как это сделать.

Если вы еще не прочли урок о том, как создать сценарий действия с помощью JavaScript, то сделайте это сейчас. Данный урок основан на нём.

Давайте начнём
Как и в уроке по созданию действия, создайте новый файл в каталоге расширений (Documents\CopperCube\extensions в Windows или ~/Documents/CopperCube/extensions в Mac OS X) и назовите его "behavior_moveBetweenPoints.js". Откройте его в текстовом редакторе и наполните следующим текстом:
Код
/*
  <behavior jsname="behavior_moveBetweenPoints"
   description="Move scene node between 2 points">
      <property name="EndPoint" type="vect3d" default="100.0, 100.0, 100.0" />
      <property name="Speed" type="float" default="0.02" />
  </behavior>
*/

behavior_moveBetweenPoints = function()
{
   this.LastTime = null;
   this.StartPoint = null;
};

// вызывается каждый кадр.
//   'node' - это узел сцены, к которому привязано это поведение.
//   'timeMs' - текущее время сцены в миллисекундах.
// Возвращает'true' (истина), если что-то изменилось, и 'false' (ложь), если нет.
behavior_moveBetweenPoints.prototype.onAnimate = function(node, timeMs)
{
   // получаем время последнего кадра
 
  if (this.LastTime == null)
  {
    // мы раньше не вызывали функцию, поэтому сохраним время и отменим
    this.LastTime = timeMs;
    this.StartPoint = ccbGetSceneNodeProperty(node, 'Position');
    return false;
  }
 
  var delta = timeMs - this.LastTime;
  this.LastTime = timeMs;
  if (delta > 200) delta = 200; // не позволяем перемещений дольше 200 миллисекунд
 
  // перемещение
 
  var pos = ccbGetSceneNodeProperty(node, 'Position');
     
  var movementVector = this.EndPoint.substract(this.StartPoint);
 
  if (pos.substract(this.StartPoint).getLength() > movementVector.getLength())
  {
    // достигнута конечная точка, переключаем направление и перезапускаем
     
    var tmp = this.StartPoint;
    this.StartPoint = this.EndPoint;
    this.EndPoint = tmp;
     
    movementVector = this.EndPoint.substract(this.StartPoint);
  }   
 
  // перемещение
     
  movementVector.normalize();
 
  pos.x += movementVector.x * delta * this.Speed;
  pos.y += movementVector.y * delta * this.Speed;
  pos.z += movementVector.z * delta * this.Speed;
         
  // устанавливаем новую позицию
 
  ccbSetSceneNodeProperty(node, 'Position', pos);
 
  return true;
}

Если вы запустите CopperCube, то станет доступно новое поведение под названием "Move scene node between 2 points" («Перемещать узел сцены между 2 точками»). Теперь в сцене CopperCube по умолчанию нажмите на 3D-куб  'cubeMesh1', выберите вкладку 'Behavior' «Поведения». Нажмите «+», чтобы добавить новое поведение, и выберите новое поведение, которое вы найдёте в разделе  "Scripted Behaviors" «Сценарные поведения».



Если теперь вы запустите приложение, например, как Windows .exe или Mac OS X .app, то поведение будет запущено, и куб, к которому привязано поведение, начнёт непрерывно перемещаться между его текущей позицией и той, которая указана в параметре 'EndPoint' со скоростью 'Speed' «Скорость». Ваше первое собственное поведение заработало!

Как это устроено
XML в заголовке сценария поведения работает так же, как и для действий, и описано в уроке о том, как создать сценарий действия. Доступны и все типы параметров, такие как 'string' «строка», 'color' «цвет», 'texture' «текстура» и т. д. Здесь все правила одинаковы: нам нужно указать имя класса (в данном случае "behavior_moveBetweenPoints") и создать для него конструктор, как показано ниже. Единственная разница с действиями: имя класса JavaScript и имя файла, должны начинаться с 'behavior_', а не с 'action_'.
Код
behavior_moveBetweenPoints = function()
{
   this.LastTime = null;
   this.StartPoint = null;
};

В конструкторе мы инициализируем две переменные, которые нам понадобятся позже: вторая - это значение времени, когда поведение было запущено, чтобы мы могли плавно перемещать куб, независимо от текущей частоты кадров, и первая - это точка узла сцены, к которому привязано данное поведение, в данном случае куб.
Следующая функция выполняется каждый кадр и делает фактическую работу перемещения куба между двумя точками:
Код
behavior_moveBetweenPoints.prototype.onAnimate = function(node, timeMs)
{
    ...
}

Функция должна иметь имя 'onAnimate' и принимать два параметра:
  • node (узел): Узел сцены, к которому привязано поведение.
  • timeMs (время): Текущее время сцены в миллисекундах. Мы используем это, чтобы иметь возможность плавно перемещать куб: каждый раз мы сохраняем текущее время в которое вызвали функцию, чтобы рассчитать разницу во времени между этим и последним вызовом, и соответствующим образом переместить узел сцены. Но, конечно, в этом нет необходимости. Если вы предпочитаете иное, то можете игнорировать это, и создать зависимое от кадра поведение.
Код внутри этой функции просто перемещает узел, используя ccbGetSceneNodeProperty() и ccbSetSceneNodeProperty() для чтения и задания 3D-положения узла между двумя точками. Каждый раз, когда CopperCube вызывает функцию onAnimate(), узел немного перемещается в направлении свойства EndPoint (Конечная точка), и, если EndPoint (Конечная точка) достигнута, направление движения меняется на противоположное.

Добавление событий клавиатуры
Пока все хорошо, но что, если мы захотим добавить события клавиатуры в наше поведение? На самом деле, это не так сложно. Нам нужно только добавить функцию для обработки событий клавиатуры в наше поведение. Для этого добавьте следующий код в конец файла  behavior_moveBetweenPoints.js :
Код
// параметры: клавиша: код клавиши которая нажата или отпущена  
// нажатие: true (истина) если клавиша нажата, false (ложь) если отпущена
behavior_moveBetweenPoints.prototype.onKeyEvent = function(key, pressed)
{
  if (key == 32) // клавиша 'Пробел'
  {
     if (pressed)
        this.Speed = 0.02;
     else
        this.Speed = 0.0;
  }
}
Если клавиша нажата или отпущена, то вызывается эта функция. Для этого примера мы устанавливаем свойство 'this.Speed' в 0, если пробел освобождается, и в значение по умолчанию (0.02) после его нажатия. Это заставляет куб двигаться только при нажатии клавиши пробел. Легко. :)
Коды являются стандартными кодами клавиш в Windows. Наиболее популярные из них: 37 - для клавиши влево, 38 - вверх, 39 - вправо, 40 - вниз и 32 для пробела.

Добавление событий мыши
Получение событий мыши очень похоже на получение событий клавиатуры. Если вам этого не достаточно, то вы можете запросить текущие координаты мыши с помощью функций ccbGetMousePosX() и ccbGetMousePosY(). Для получения событий кнопок мыши добавьте эту функцию:
Код
// mouseEvent (событие мыши): 0=мышь движется, 1=движется колёсико мыши, 2=левая кнопка мыши отпущена,
//     3=левая кнопка мыши нажата, 4=правая кнопка мыши отпущена, 5=правая кнопка мыши нажата
behavior_moveBetweenPoints.prototype.onMouseEvent
           = function(mouseEvent, mouseWheelDelta)
{
  // здесь обработка событий мыши
}

Оффлайн Samovar

  • Житель
Re: CopperCube
« Ответ #46 : 04 Май 2019, 22:34:42 »
Урок: Создание 3D-геометрии с помощью JavaScript

Вы можете создавать новую геометрию с нуля, используя сценарии (скрипты) на JavaScript в CopperCube. Скрипты работают не только в редакторе, но и в приложении Windows .exe и Mac OS X .app во время их выполнения и могут быть очень полезны. На самом деле, всё очень просто, и этот короткий урок о том, как это делать:


Созданная геометрия


Работает это просто. Для каждой геометрии в CopperCube у вас имеется два буфера: один, в котором хранятся вершины с их позицией, цветом и т. д., и второй буфер, в котором хранятся индексы этих этих вершин. Например, если у вас есть 4 вершины:
  0-----1
  |       |
  |       |
  2-----3

Затем, для создания прямоугольника, вам нужно сделать его из двух треугольников:
  0-----1
  |    /  |
  | /     |
  2-----3

Для этого, в индексном буфере вам нужно будет сохранить два треугольника, 0-1-2 и 1-3-2. Таким образом, индексный буфер будет выглядеть так:
(0,1,2,1,3,2)

Для добавления вершины в буфер вершин есть функция ccbAddMeshBufferVertex(), а для добавления индекса используйте функцию ccbAddMeshBufferIndex().

В коде примера, мы позволяем пользователю выбрать 3D-объект в редакторе и заменить всю его геометрию прямоугольником:

Код
// используем текущий выбранный в редакторе узел 
 
var meshnode = editorGetSelectedSceneNode();
var bufferCount = ccbGetSceneNodeMeshBufferCount(meshnode);


if (bufferCount == 0)
  alert('The selected node has no 3D geometry.');
else
{
   // получаем старую текстуру этого узла
   var oldTexture = ccbGetSceneNodeMaterialProperty(meshnode, 0, "Texture1");
   
   // удаляем все буферы меша, содержащие геометрию, потому что мы хотим заменить ее совершенно новой геометрией
   for (var i=0; i<bufferCount; ++i)
      ccbRemoveMeshBuffer(meshnode, 0);
     
   // добавляем новый буфер
   ccbAddMeshBuffer(meshnode);
   
   // отключаем динамическое освещение и устанавливаем текстуру
   ccbSetSceneNodeMaterialProperty(meshnode, 0, 'Lighting', false);
   ccbSetSceneNodeMaterialProperty(meshnode, 0, "Texture1", oldTexture);
   
   // добавляем 4 вершины
   ccbAddMeshBufferVertex(meshnode, 0, new vector3d(0,10,0));
   ccbAddMeshBufferVertex(meshnode, 0, new vector3d(10,10,0));
   ccbAddMeshBufferVertex(meshnode, 0, new vector3d(0,0,0));
   ccbAddMeshBufferVertex(meshnode, 0, new vector3d(10,0,0));
   
   // назначаем цвета вершинам
   ccbSetMeshBufferVertexColor(meshnode, 0, 0, 0x77400000);
   ccbSetMeshBufferVertexColor(meshnode, 0, 1, 0x77400000);
   ccbSetMeshBufferVertexColor(meshnode, 0, 2, 0x77400000);
   ccbSetMeshBufferVertexColor(meshnode, 0, 3, 0x77400000);
   
   // устанавливаем текстурные координаты
   ccbSetMeshBufferVertexTextureCoord(meshnode, 0, 0, new vector3d(0,1,0));
   ccbSetMeshBufferVertexTextureCoord(meshnode, 0, 1, new vector3d(1,1,0));
   ccbSetMeshBufferVertexTextureCoord(meshnode, 0, 2, new vector3d(0,0,0));
   ccbSetMeshBufferVertexTextureCoord(meshnode, 0, 3, new vector3d(1,0,0));
   
   // Добавляем 6 индексов, чтобы создать из них 2 треугольника.
   // Обратите внимание, что порядок вершин по часовой стрелке важен.
   // Если вы добавляете индексы 0,1,2, то вы создаете треугольник обращенный к вам лицевой стороной,
   // если вы добавите 0,2,1, то он будет смотреть в противоположном направлении.
   
   ccbAddMeshBufferIndex(meshnode, 0, 0);
   ccbAddMeshBufferIndex(meshnode, 0, 1);
   ccbAddMeshBufferIndex(meshnode, 0, 2);
   ccbAddMeshBufferIndex(meshnode, 0, 1);
   ccbAddMeshBufferIndex(meshnode, 0, 3);
   ccbAddMeshBufferIndex(meshnode, 0, 2);   
   
   // обновляем габаритный прямоугольник узла
   ccbUpdateSceneNodeBoundingBox(meshnode);
}

Откройте окно редактирования сценариев (скриптов) (View -> Show Scripting Window), очистите весь текст в нем, вставьте туда этот текст и нажмите 'execute' «выполнить». Не забудьте до этого выделить 3D-объект.

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Re: CopperCube
« Ответ #47 : 04 Май 2019, 23:11:06 »
Блин, как же я не люблю яваскрипт...

Цитировать
Самым простым дополнением CopperCube, является программирование сценария действия.
Проще всего создать расширение для CopperCube - запрограммировать сценарий действия.

Цитировать
Если вы перезапустите CopperCube, то будет доступно новое действие с именем «Move Position».
Если вы перезапустите CopperCube, то новое действие с именем «Move Position» станет доступным.

Цитировать
Поскольку мы изменили код JavaScript, чтобы использовать свойство 'MoveWhat' «Что двигать» для изменения положения узла сцены, теперь вам нужно выбрать узел сцены в свойстве  'MoveWhat', на который следует повлиять.
Поскольку мы изменили код JavaScript так, чтобы в нём использовалось свойство 'MoveWhat' «Что двигать» для изменения положения узла сцены, теперь вам нужно в редакторе в свойстве 'MoveWhat' выбрать узел сцены, на который следует повлиять.

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Re: CopperCube
« Ответ #48 : 04 Май 2019, 23:14:25 »
А можно маленькое разъясненьице для особо тупых, вроде меня. Я вроде всё читал и даже немного правил, но вот как-то мимо меня пролетело...

Вопрос такой:
Что такое "Действие", и что такое "Поведение", и чем они отличаются?

Оффлайн Samovar

  • Житель
Re: CopperCube
« Ответ #49 : 04 Май 2019, 23:30:08 »
Цитировать
Что такое "Действие", и что такое "Поведение", и чем они отличаются?
Я пока ещё не дошел до перевода этого, да и толком об этом в справке нет... Вот чего пишут и как я понял:

Поведение (Нечто вроде события, но уже включающее некоторые действия и дающее доступ к  подключению других действий):
Цитировать
CopperCube включает в себя несколько поведений и действий, которые могут быть добавлены к любому трехмерному и двумерному объекту в сцене. Благодаря этому, возможно не только анимировать трехмерные объекты, но и добавить интерактивность вашему трехмерному приложению: реагирование на нажатия клавиш и кнопок, воспроизведение звуков или даже создание игровых персонажей, контролируемых искусственным ителлектом (AI).

Действие (Реакция на события в поведении или другие действия):
Цитировать
CopperCube включает в себя несколько действий, которые могут быть вызваны поведением и другими действиями. С их помощью можно не только анимировать трехмерные объекты, но и добавить интерактивность вашему трехмерному приложению: реагирование на нажатия клавиш и кнопок, воспроизведение звуков или даже создание игровых персонажей, контролируемых ИИ.

То есть действия могут быть запущены только поведениями или другими действиями... действий без подведения не может быть.
Для любого объекта должны быть вначале созданы поведения, которые будут производить какие-либо действия... расширять функционал можно как за счёт написания собственных действий, которые будут доступны из любого встроенного поведения и действия, так и за счёт написания собственных проведений (типа опроса клавиатуры и мыши, как в уроке). Походу, действия - это более простые расширения CopperCube, чем более комплексные поведения.
« Последнее редактирование: 04 Май 2019, 23:52:55 от Samovar »

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Re: CopperCube
« Ответ #50 : 05 Май 2019, 00:07:48 »
Цитировать
Походу, действия - это более простые расширения CopperCube, чем более комплексные поведения.
Ну, ладно, пока будем так считать.

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Re: CopperCube
« Ответ #51 : 05 Май 2019, 00:10:04 »
Цитировать
В конструкторе мы инициализируем две переменные, которые нам понадобятся позже: вторая - это значение времени, когда поведение было запущено, чтобы мы могли плавно перемещать куб, независимо от текущей частоты кадров, и первая - это точка узла сцены, к которому привязано данное поведение, в данном случае куб.
В конструкторе мы инициализируем две переменные, которые нам понадобятся позже: this.LastTime - значение времени последнего раза, когда это поведение было выполнено, чтобы мы могли плавно перемещать куб независимо от текущей частоты кадров, и this.StartPoint - начальное положение узла сцены, к которому привязано данное поведение, в данном случае куба.

Цитировать
Мы используем это, чтобы иметь возможность плавно перемещать куб: каждый раз мы сохраняем текущее время в которое вызвали функцию, чтобы рассчитать разницу во времени между этим и последним вызовом, и соответствующим образом переместить узел сцены.
Мы используем его, чтобы иметь возможность плавно перемещать куб: каждый раз мы сохраняем текущее время, в которое функция была вызвана, чтобы рассчитать разницу во времени между этим и прошлым вызовом, и соответствующим образом переместить узел сцены.

Оффлайн Samovar

  • Житель
Re: CopperCube
« Ответ #52 : 05 Май 2019, 17:38:37 »
Цитировать
В конструкторе мы инициализируем две переменные, которые нам понадобятся позже: вторая - это значение времени, когда поведение было запущено, чтобы мы могли плавно перемещать куб, независимо от текущей частоты кадров, и первая - это точка узла сцены, к которому привязано данное поведение, в данном случае куб.
В конструкторе мы инициализируем две переменные, которые нам понадобятся позже: this.LastTime - значение времени последнего раза, когда это поведение было выполнено, чтобы мы могли плавно перемещать куб независимо от текущей частоты кадров, и this.StartPoint - начальное положение узла сцены, к которому привязано данное поведение, в данном случае куба.
Да, грубейшая ошибка из-за моей невнимательности и незнания JavaScript. Поправил. Спасибо!

Оффлайн Samovar

  • Житель
Re: CopperCube
« Ответ #53 : 05 Май 2019, 19:09:11 »
Цитировать
Походу, действия - это более простые расширения CopperCube, чем более комплексные поведения.
Ну, ладно, пока будем так считать.
Хрен его знает. Вот, в другом 2D-конструкторе Stencil, тоже применяют понятие "поведение": http://www.stencyl.com/help/view/introduction-to-behaviors/
Цитировать
Поведения - это настраиваемые «способности», которые вы прикрепляете к типам актеров или сценам. Вместе они составляют «мозги» игры, обрабатывая все взаимодействия, происходящие в игровом мире.

Оффлайн Samovar

  • Житель
Re: CopperCube
« Ответ #54 : 06 Май 2019, 13:26:08 »
Упаковка текстур

CopperCube имеет встроенный упаковщик текстур.
Это полезно, если вы используете 3D-модели (например, загруженные из Интернета), которые не были оптимизированы для игр. В большинстве 3D-моделей, доступных онлайн, наложено множество текстур, что существенно замедлит вашу игру при её рендеринге. Теперь вы можете просто кликнуть правой кнопкой мыши по такой модели и выбрать "Modify -> Pack all textures of selection into one" «Изменить -> Упаковать все текстуры выделения в одну». Это оптимизирует текстуры вашей 3D-модели и сделает ее рендеринг намного быстрее.



Если 3D-модель имеет 15 текстур, то для её рендеринга потребуется 15 вызовов функции рисования. Это очень медленно. В идеале 3D-модель должна быть нарисована всего одним вызовом.
Поэтому кликните правой кнопкой мыши на 3D-модели и выберите 'Modify Selection' -> 'Pack all textures of selection into one' «Изменить выделение» -> «Упаковать все текстуры выделения в одну».



Когда вы запустите упаковщик текстур, он спросит про размер текстуры, которую вы хотите использовать как конечное изображение. Лучше использовать размер степени двойки, например 1024 или 2048. Остальное делается автоматически.



Для веб-платформ, таких как WebGL, это всегда наилучшее решение, поскольку это также уменьшает и количество загрузок, поэтому ваше приложение будет запускаться быстрее.

Оффлайн Samovar

  • Житель
Re: CopperCube
« Ответ #55 : 06 Май 2019, 13:47:29 »
Перемещение с помощью JavaScript

В этом примере показано, как переместить трехмерный объект сцены в CopperСube с помощью JavaScript. Это можно использовать только в том случае, если целевой платформой является Windows (.exe) или MacOS (.app). Если вам нужна платформа WebGL, то смотрите здесь.

Вначале, сделайте следующее:
  • Запустите редактор CopperCube и создайте новую 3D-сцену. Обычно в этой сцене должен присутствовать скайбокс и куб с именем 'cubeMesh1'.
  • Добавьте плоскость с помощью кнопки 'Create a plane' «Создать плоскость» на вкладке 'Create' «Создать», со значениями по умолчанию.
  • Немного переместите плоскость, чтобы сцена выглядела примерно так:

Сцена для этого примера.


  • Сохраните сцену как  'test.ccb'
  • Опубликуйте его как файл Windows (.exe) (или Mac OS X (.app)), используя 'Tools -> Test as Windows Application' или  'File -> Publish -> Publish as Windows Application', «Инструменты -> Тестировать как приложение Windows» или «Файл -> Опубликовать -> Опубликовать как приложение Windows». Должен быть создан файл с именем test.exe, на основе файла test.ccb.
  • Теперь создайте пустой текстовый файл, в том месте где вы сохранили файл test.ccb, и назовите его 'test.js'. Отредактируйте этот файл с помощью вашего любимого текстового редактора (рекомендуется: Notepad ++, он поддерживает подсветку синтаксиса JavaScript). При публикации вашего файла сейчас как Windows .exe, CopperCube включит этот сценарий в файл .exe и будет использовать его в качестве основного сценария.
Напишите следующий код в вашем файле .js
Код
// регистрируем события клавиатуры
ccbRegisterKeyDownEvent("keyPressedDown");

function keyPressedDown(keyCode)
{
   if (keyCode == 88)
   {
      // пользователь нажимает клавишу 'X', и тем самым, немного перемещает узел 'cubeMesh1'
      var cube = ccbGetSceneNodeFromName("cubeMesh1");   
      var pos3d = ccbGetSceneNodeProperty(cube, "Position");
     
      pos3d.y += 2;
     
      ccbSetSceneNodeProperty(cube, "Position", pos3d);
   }
}
Когда вы снова запустите приложение ('Tools -> Test As Windows Application (.exe)' «Инструменты -> Тестировать приложение Windows (.exe)»), куб будет немного перемещаться вверх каждый раз, при нажатии на клавишу 'X'.

Этот пример работает с помощью доступа к API JavaScript. Благодаря API вы можете манипулировать всеми аспектами трехмерной сцены: текстурами, материалами, позициями, объектами и т. д. Для получения полной справки обо всех функциях смотрите Справочник по JavaScript.

Оффлайн Samovar

  • Житель
Re: CopperCube
« Ответ #56 : 06 Май 2019, 13:59:57 »
Столкновение с помощью JavaScript

В этом примере показано, как проверить столкновение между курсором мыши и 3D-объектом в сцене  CopperСube с помощью JavaScript. Это можно использовать только в том случае, если целевой платформой является Windows (.exe) или MacOS (.app). Если вам нужна платформа WebGL, то смотрите здесь.

Вначале, сделайте следующее:
  • Запустите редактор CopperCube и создайте новую 3D-сцену. Обычно в этой сцене должен присутствовать скайбокс и куб с именем 'cubeMesh1'.
  • Добавьте второй куб с помощью кнопки 'Create a cube' «Создать куб» на вкладке 'Create' «Создать», со значениями по умолчанию.
  • Немного переместите кубы, чтобы сцена выглядела примерно так:

Сцена для этого примера.
  • Напишите в свойстве 'Name' «Имя» первого куба текст 'cubeMesh1', а для имени второго куба - 'cubeMesh2', как показано на рисунке выше. Примечание: имена чувствительны к регистру, поэтому обязательно назовите их точно так, как описано.
  • Создайте новую камеру, используя 'Edit -> Insert -> Create Camera' «Правка -> Вставить -> Создать камеру» и выберите 'Simple Camera' «Простая камера». Переместите камеру так, чтобы она смотрела на оба куба.
  • Сохраните сцену как 'test.ccb'
  • Опубликуйте его как файл Windows (.exe) (или Mac OS X (.app)), используя 'Tools -> Test as Windows Application' или  'File -> Publish -> Publish as Windows Application', «Инструменты -> Тестировать как приложение Windows» или «Файл -> Опубликовать -> Опубликовать как приложение Windows». Должен быть создан файл с именем test.exe, на основе файла test.ccb.
  • Теперь создайте пустой текстовый файл, в том месте где вы сохранили файл test.ccb, и назовите его 'test.js'. Отредактируйте этот файл с помощью вашего любимого текстового редактора (рекомендуется: Notepad ++, он поддерживает подсветку синтаксиса JavaScript). При публикации вашего файла сейчас как Windows .exe, CopperCube включит этот сценарий в файл .exe и будет использовать его в качестве основного сценария.
Используйте следующий код:
Код
// регистрируем событие рисования
ccbRegisterOnFrameEvent("onFrameDrawing");

function onFrameDrawing()
{
   var mouseX = ccbGetMousePosX();
   var mouseY = ccbGetMousePosY();
   
   // test collision

   var cube1 = ccbGetSceneNodeFromName("cubeMesh1");   
   var cube2 = ccbGetSceneNodeFromName("cubeMesh2");   
   
   var endPoint3d = ccbGet3DPosFrom2DPos(mouseX, mouseY);
   var startPos3D = ccbGetSceneNodeProperty(ccbGetActiveCamera(), "Position");
   
   var cube1Hovered = ccbDoesLineCollideWithBoundingBoxOfSceneNode(cube1, startPos3D.x, startPos3D.y, startPos3D.z, endPoint3d.x, endPoint3d.y, endPoint3d.z);
                                     
   var cube2Hovered = ccbDoesLineCollideWithBoundingBoxOfSceneNode(cube2, startPos3D.x, startPos3D.y, startPos3D.z, endPoint3d.x, endPoint3d.y, endPoint3d.z);
   
   ccbSetSceneNodeMaterialProperty(cube1, 0, "Wireframe", cube1Hovered);
   ccbSetSceneNodeMaterialProperty(cube2, 0, "Wireframe", cube2Hovered);
}
Теперь, когда вы снова запустите приложение ('Tools -> Test As Windows Application (.exe)' «Инструменты -> Тестировать как приложение Windows (.exe)»), включится режим каркасного отображения куба, на котором находится указатель мыши. Результат должен выглядеть так:


3D-объект, над которым находится указатель мыши, будет нарисован в режиме каркаса.

Этот пример работает с помощью доступа к API JavaScript. Благодаря API  вы можете манипулировать всеми аспектами трехмерной сцены: текстурами, материалами, позициями, объектами и т. д.  Для получения полной справки обо всех функциях смотрите Справочник по JavaScript.

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Re: CopperCube
« Ответ #57 : 07 Май 2019, 13:53:39 »
Цитировать
Опубликуйте его как файл Windows (.exe) (или Mac OS X (.app)), используя 'Tools -> Test as Windows Application' или  'File -> Publish -> Publish as Windows Application', «Инструменты -> Тестировать как приложение Windows» или «Файл -> Опубликовать -> Опубликовать как приложение Windows».
Опубликуйте её как файл Windows (.exe) (или Mac OS X (.app)), используя 'Tools -> Test as Windows Application' или  'File -> Publish -> Publish as Windows Application', «Инструменты -> Тестировать как приложение Windows» или «Файл -> Опубликовать -> Опубликовать как приложение Windows».
(Относится сразу к двум последним статьям)

Цитировать
Теперь создайте пустой текстовый файл, в том месте где вы сохранили файл test.ccb, и назовите его 'test.js'.
Теперь создайте пустой текстовый файл в том месте, где вы сохранили файл test.ccb, и назовите его 'test.js'.

Цитировать
Когда вы снова запустите приложение ('Tools -> Test As Windows Application (.exe)' «Инструменты -> Тестировать приложение Windows (.exe)»), куб будет немного перемещаться вверх каждый раз, при нажатии на клавишу 'X'.
Когда вы снова запустите приложение ('Tools -> Test As Windows Application (.exe)' «Инструменты -> Тестировать приложение Windows (.exe)»), куб будет немного перемещаться вверх каждый раз при нажатии на клавишу 'X'.

Оффлайн Samovar

  • Житель
Re: CopperCube
« Ответ #58 : 07 Май 2019, 18:51:32 »
Благодарю, Striver. Поправил. Ехаем дальше...

Оффлайн Samovar

  • Житель
Re: CopperCube
« Ответ #59 : 08 Май 2019, 18:53:41 »
Местность и деревья

CopperCube  поддерживает рендеринг местности, и обладает редактором для создания её ландшафта, растений, травы и многого другого.




Как редактировать ландшафт местности
После того, как вы создали базовую местность, либо с помощью команды  "Edit -> Insert Terrain" «Правка -> Вставить местность», либо кликнув значок местности, у вас есть возможность редактировать её с помощью нескольких команд:


  • Move Camera (Переместить камеру): Используется для перемещения по сцене. Вы также можете использовать для этого стандартные кнопки в левом верхнем углу редактора и стрелки на клавиатуре.
  • Paint Texture (Красить текстурой): Из окна текстур, находящегося в нижней части редактора, выберите текстуру, и рисуйте ей на местности.
  • Raise/Lower Terrain (Повысить/понизить местность): Чтобы повысить или понизить ландшафт местности, выберите часть местности, нажмите левую кнопку мыши, и переместите её вперёд или назад.
  • Mountain/Valley tool (Инструмент гора/долина): Чтобы создать гору или долину, выберите часть местности, нажмите левую кнопку мыши, и переместите её вперёд или назад.
  • Smooth tool (Инструмент сглаживания): Чтобы сделать ландшафт более гладким, удерживайте левую кнопку мыши и рисуйте по местности.
  • Flatten tool (Инструмент сплющивания): Чтобы сделать ландшафт более плоским, удерживайте левую кнопку мыши и рисуйте по местности.
  • Noise tool (Инструмент неровностей): Чтобы сделать ландшафт более неровным, удерживайте левую кнопку мыши и рисуйте по местности.
  • Grass painting (Красить травой): Из окна текстур, находящегося в нижней части редактора, выберите текстуру для вертикального билборда травы. Чтобы добавить траву, удерживайте левую кнопку мыши и рисуйте по местности.  Если при этом удерживать клавишу Shift на клавиатуре, то вы будете удалять траву. Кроме того, пока этот инструмент выбран, вы можете указать ширину и высоту вертикальных билбордов травы.
Распределение  полигональных сеток (мешей) по местности
В CopperCube есть команда для распределения полигональных сеток (мешей) по местности, таких как деревья или камни.  Для этого вы можете использовать генератор дерева или любую статическую или анимированную полигональную модель. Вначале сделайте следующее:

Импортируйте свою статическую или анимированную полигональную 3D-модель, используя,  "File -> Import -> Static 3D Mesh from File" или "File -> Import -> Animated 3D Mesh", «Файл -> Импорт -> Статическая 3D-модель из файла» или «Файл -> Импорт -> Анимированная 3D-модель». Обратите внимание, что вы можете распределять только анимированные полигональные модели по рельефу местности из соображений производительности и памяти (такие данные распределяются и сортируются более эффективно), поэтому, если вы используете статическую полигональную сетку, вам необходимо преобразовать ее в анимированную. Для этого кликните правой кнопкой мыши в 3D-виде выберите "Modify Selection -> Clone as static animated mesh" «Изменить выделение -> Клонировать как статическую анимированную полигональную сетку». Модель будет клонирована в статическую анимированную полигональную сетку и показана в редакторе анимации. Там кликните правой кнопкой мыши на 3D-виде и выберите 'Create instance' «Создать экземпляр». Теперь у вас есть необходимая статическая анимированная полигональная сетка в 3D-виде сцены, и вы можете кликнуть по ней правой кнопкой мыши и выбрать "Modify Selection -> Distribute over terrain" «Изменить выделение -> Распределить по местности».

Данный метод использования анимированных полигональных сеток также имеет еще одно преимущество: если у вас есть неанимированная полигональная сетка, то в редакторе анимированных полигональных сеток вы можете кликнуть правой кнопкой мыши на 3D-виде и использовать команду "Set Static Collision Box" «Установить габаритный контейнер для статических столкновений». Там можно указать относительные координаты и размеры габаритного контейнера для обнаружения столкновений (x,y,z,размер по x, размер по y, размер по z), которые, например, будут немного меньше фактических размеров полигональной сетки (меша). Это полезно, например, для деревьев: пусть габаритный контейнер столкновений вмещает только ствол дерева, чтобы было возможным намного легче перемещаться по местности.


Добавление собственных полигональных сеток (мешей) на местность
Если вы хотите добавить свои собственные меши на ландшафт местности, например, дома или аналогичные объекты, и эффективно их сортировать, чтобы ускорить запуск вашей игры или приложения, то можете сделать это легко:
В окне менеджера сцены просто перетащите необходимый меш на узел местности. Полигональная сетка будет автоматически прикреплена к ландшафту местности, благодаря чему ваше приложение будет рендериться намного быстрее.
Но есть недостаток: если вы добавляете узел в качестве дочернего элемента местности, то он больше не должен перемещаться, когда ваше приложение или игра запущены. Так что используйте это только для неподвижных объектов.


Генерация деревьев
CopperCube включает в себя возможность создавать процедурно сгенерированные деревья на основе заданных пользователем параметров. Эта функция является бета-версией и пока не очень удобна для пользователя, но планируется её усовершенствование в будущих версиях. Используйте команду "Edit -> Insert -> Create a tree" «Правка -> Вставить -> Создать дерево», чтобы открыть диалоговое окно создания дерева. Там вы можете указать множество параметров для генерации дерева.




Обратите внимание, что вы можете выбрать 'generate as animated mesh'  «создать как анимированную полигональную сетку», чтобы дерево было легко использовать для команды "Distribute over terrain"  «Распределение по местности».


Ветер
По умолчанию трава и листья деревьев колышутся ветром. Вы можете настроить параметры ветра, выбрав корневой узел в менеджере сцены, и изменив значения под флажком  'Wind' «Ветер» в окне свойств. Дополнительно вы можете включить/отключить колыхание травы в окне свойств узла местности.

Данная функция работает и для других объектов. У них необходимо настроить тип материала: если у вас есть материал типа "Transparent (alpha channel)"«Прозрачный (альфа-канал)», то вы можете выбрать в конце списка типов материалов  "Advanced Settings..."  «Расширенные настройки ...» и установить флажок "Moved by Wind" «Колышется ветром».

Функция работает на платформах: WebGL, Android и Windows / D3D. На платформах не поддерживающих колыхание ветром, система автоматически возвращается к статической растительности. Это не влияет на производительность, поскольку колыхания ветром рассчитываются на GPU.


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


Импорт карт высот
Вы можете импортировать карты высот в CopperCube из других программ. Просто используйте команду "File -> Import -> Terrain Heightmap" «Файл -> Импорт -> Карта высот местности». Coppercube может импортировать карты высот в  форматах: .raw, .r16, .r32, .png, .tga и .pgm.Также имеется возможность автоматически применять текстуры к импортированной местности и распределять траву по ней.

Нормальный размер импортируемой карты высот - 128x128 пикселей. Если вы используете большее разрешение карты высот, то получите более огромный мир.

 


Яметрика

* По форуму

* Рекламный блок

* Последние вложения

1 (1).png
Скачано: 68
Автор: LEXA ANЭGROWND
blender.png
Скачано: 78
Автор: ipv2007
4.png
Скачано: 100
Автор: hiroyukiss
2.png
Скачано: 122
Автор: hiroyukiss

Скачано: 112
Автор: Dilifa12