Начиная с версии 6.0 стал бесплатенНу, класс! А нахрена я тогда 5-ю покупал? Правда, руки так и не дошли разобраться с этим движком. И JavaScript - штука несколько неприятная...
ЦитироватьНачиная с версии 6.0 стал бесплатенНу, класс! А нахрена я тогда 5-ю покупал? Правда, руки так и не дошли разобраться с этим движком. И JavaScript - штука несколько неприятная...
Вот список доступного функционала при покупке профессиональной версии за 6 тысяч 580 рублей, и студий за 13 тысяч рублей:На стиме всё-таки дешевле:
Ниже приведены хорошие места, чтобы начать чтение документации:Ниже приведены хорошие отправные точки, чтобы начать чтение документации:
Из этого урока вы узнаете, как создать контроллер камеры от первого лица, с помощью которого вы сможете прогуляться по трехмерной сцене и сталкиваться со стенами.Из этого урока вы узнаете, как создать контроллер камеры от первого лица, с помощью которого вы сможете прогуляться по трехмерной сцене и отслеживать столкновения со стенами.
В этом уроке показано, как создать простое приложение для просмотра 3D-моделей, позволяющее просматривать 3D-модель со всех сторон, управляя мышью.В этом уроке показано, как создать простое приложение-просмотрщик, позволяющее просматривать 3D-модель со всех сторон, управляя мышью.
Из этого урока вы узнаете, как создать полёт камеры через трехмерный мир, используя функцию «путь» в CopperCube.Из этого урока вы узнаете, как создать пролёт камеры через трехмерный мир, используя функцию «путь» в CopperCube.
Пример показывает, как создать сценарий с помощью JavaScript, который можно использовать как и встроенные действия для всех целевых платформ.Пример показывает, как создать сценарий на языке JavaScript, который можно будет использовать также, как и встроенные действия на всех целевых платформах.
Пример показывает, как создать сценарий поведения с помощью JavaScript,который можно использовать как и встроенные поведения для всех целевых платформ.Пример показывает, как создать сценарий поведения с помощью JavaScript,который можно будет использовать также, как и встроенные поведения на всех целевых платформах.
При запуске редактора, появляется главный вид и панель инструментов с четырьмя кнопками, которыми можно изменить текущий активный вид:При запуске редактора появляется главный вид и панель инструментов с четырьмя кнопками, которыми можно изменить текущий активный вид:
Например, с помощью кнопки с изображением куба, вы можете создать куб.Например, с помощью кнопки с изображением куба вы можете создать куб.
Двойной клик по одной из текстур в окне текстур ниже, назначит на объект полигональной сетки куба новую текстуру.Двойной клик по одной из текстур в окне текстур внизу назначит на объект полигональной сетки куба новую текстуру.
Есть и другие кнопки для создания сфер, конусов и цилиндров.Есть и другие кнопки, позволяющие создавать сферы, конусы и цилиндры.
Вуаля, теперь он в CopperCube, и вы можете разместить его, масштабировать, редактировать его материалы и использовать в 3D-сцене.Вуаля, теперь он внутри CopperCube, и вы можете размещать его, масштабировать, редактировать его материалы и использовать в 3D-сцене.
Есть много поддерживаемых 3D-форматов файлов.Поддерживается большое количество 3D-форматов файлов.
Не имеет смысла иметь более одного скайбокса на сцену.Не имеет смысла добавлять более одного скайбокса на сцену.
Чтобы определить, как пользователи приложения созданного в CopperCube должны управлять камерой, необходимо добавить объект камеры в сцену.Чтобы определить, как пользователи приложения, созданного в CopperCube, должны управлять камерой, необходимо добавить объект камеры в сцену.
Просто нажмите кнопку камеры на вкладке панели инструментов редактирования сцены, и откроется диалоговое окно, в котором вы можете выбрать тип камеры для использования:Просто нажмите кнопку камеры на вкладке панели инструментов редактирования сцены, и откроется диалоговое окно, в котором вы сможете выбрать тип камеры для использования:
Есть несколько типов камер на выбор:Существует несколько типов камер на выбор:
После добавления новой камеры вы можете заметить, что у нее появится линия соединяющаяся с точкой в пространстве:После добавления новой камеры, вы можете заметить, что у нее появится линия соединения с точкой в пространстве:
Примечание: Вы также можете быстро создать объект трехмерного мира, используя генератор комнат встроенный в CopperCube.Примечание: Вы также можете быстро создать объект трехмерного мира, используя генератор комнат, встроенный в CopperCube.
Если в сцене более одной камеры, убедитесь, что для камеры с эллипсоидом включен параметр Active «Активна» во вкладке атрибутов Attributes окна свойств Properties.Если в сцене присутствует более одной камеры, убедитесь, что для камеры с эллипсоидом включен параметр Active «Активна» во вкладке атрибутов Attributes окна свойств Properties.
Точно у Free Flying Camera и у First Person Shooter camera должно быть одинаковое описание?В оригинале так и было...
Для начала нам нужна 3D-сцена, в которой есть несколько 3D-объектов, с которыми мы сможем взаимодействовать.С помощью панели инструментов Create «Создать» (или используйте меню: Edit -> Insert «Правка -> Вставить») создайте 4 случайных объекта: сферы, кубы или цилиндры, и камеру Simple Camera «Простая камера».Для начала нам нужна 3D-сцена, в которой есть несколько 3D-объектов, с которыми мы сможем взаимодействовать. С помощью панели инструментов Create «Создать» (или используйте меню: Edit -> Insert «Правка -> Вставить») создайте 4 случайных объекта: сферы, кубы или цилиндры, и камеру Simple Camera «Простая камера».
Как только вы настроите свою сцену, перейдём к важной части: мы хотим сделать так, что бы один из объектов, скажем, цилиндр, исчезал, когда мы нажмем на другой объект - сферу.Как только вы настроите свою сцену, перейдём к важной части: мы хотим сделать так, чтобы один из объектов, скажем, цилиндр, исчезал, когда мы нажмем на другой объект - сферу.
Есть 3 режима на выбор: Make Invisible «Сделать невидимым», который скроет объект, Make Visible «Сделать видимым», который покажет его или Toggle Visibility «Переключить видимость», который сделает его видимым, если он невидим и невидимым, если он виден.Есть 3 режима на выбор: Make Invisible «Сделать невидимым», который скроет объект, Make Visible «Сделать видимым», который покажет его или Toggle Visibility «Переключить видимость», который сделает его видимым, если он невидим, и невидимым, если он виден.
Это тело столкновения, в основном размером с человека, который ходит по сцене.Это тело столкновения, фактически имеющее размер идущего по сцене человека.
Вы можете проверить, в порядке ли ваша камера, протестировав ваше приложение, например, нажав Инструменты -> Тестировать как приложение Windows, и немного попробовать перемещаться в вашей 3D-сцене.Вы можете проверить, в порядке ли ваша камера, протестировав ваше приложение, для этого, например, нажмите Инструменты -> Тестировать как приложение Windows, и попробуйте немного подвигаться по вашей 3D-сцене.
Вы можете легко изменить его поведение в поведении "Game Actor with Health" «Игрок со здоровьем», см. его документацию на странице Обзора поведений.Вы легко можете изменить то, как он себя ведёт, настроив поведение "Game Actor with Health" «Игрок со здоровьем», см. документацию об этом на странице Обзора поведений.
Но действие, которое мы только что добавили, поворачивает персонажа так, что он выглядит так, как будто он падает на землю.Но действие, которое мы только что добавили, поворачивает персонажа таким образом, что он выглядит падающим на землю.
Одной из главных особенностей игр от первого лица является то, что в них можно стрелять.Всё-таки не все игры от первого лица являются шутерами, поэтому:
Поэтому для этого нам нужно добавить оружие для игрока.Для этого нам нужно добавить игроку оружие.
Много работы ещё нужно сделать, и в этом уроке это выходит за рамки объяснения каждой мелочи, но вот несколько советов, как доработать игру:Много работы ещё нужно сделать, а объяснение каждой мелочи выходит за рамки этого урока, но вот несколько советов, как доработать игру:
Затем вам, вероятно, нужно немного отрегулировать её положение и вращение, чтобы всё хорошо вписывалось в экран.Затем вам, вероятно, понадобится немного отрегулировать её положение и вращение, чтобы всё хорошо вписывалось в экран.
В игре модель оружия будет прикреплена к камере, будет следовать за ней и будет видна игроку, как это сделано в играх от первого лица.В игре модель оружия будет прикреплена к камере, будет следовать за ней и будет видна игроку, как это обычно реализуется в играх от первого лица.
Например, где-то в сцене установлен объект звук, при попадание в радиус которого, солдат произносит что-то с удивлением.Например, где-то в сцене установлен объект звук, при попадании в радиус которого, солдат с удивлением что-то произносит.
В этом примере я использовал 3D-модель комнаты с запечёнными в карту (изображение) освещением (lightmap), вы можете найти модель в каталоге примеров с именем файла lightmaps.ccb, если захотите её использовать:В этом примере я использовал 3D-модель комнаты с запечённым в карту (изображение) освещением (lightmap). Вы можете найти эту модель в каталоге примеров с именем файла lightmaps.ccb, если захотите её использовать:
Выбирая узлы пути, вы можете перемещать их и редактировать путь по которому камера будет следовать через трехмерную сцену.Выбирая узлы пути, вы можете перемещать их и редактировать путь, по которому камера будет следовать через трехмерную сцену.
Просто создайте новую камеру, нажав на вкладку 'Create' «Создать» и кликните значок с изображением камеры, (в качестве альтернативы используйте меню: 'Edit -> Insert -> Create a Camera' «Правка -> Вставить -> Создать камеру»).Просто создайте новую камеру, нажав на вкладку 'Create' «Создать», и кликните значок с изображением камеры, (в качестве альтернативы используйте меню: 'Edit -> Insert -> Create a Camera' «Правка -> Вставить -> Создать камеру»).
Это добавит поведение к камере, заставляющие камеру двигаться по выбранному пути.Это добавит поведение к камере, заставляющее её двигаться по выбранному пути.
Вам нужно только указать по какому пути следовать камере.Вам нужно только указать, по какому пути следовать камере.
Если вы хотите, чтобы камера была направлена в направлении движения, установите флажок 'LookIntoMovementDirection' «Смотреть в направлении движения».Если вы хотите, чтобы камера была направлена в сторону движения, установите флажок 'LookIntoMovementDirection' «Смотреть в направлении движения».
Из этого урока вы узнаете, как создать простое приложение для просмотра 3D-моделей с помощью CopperCube, управляя мышью, позволяющее просматривать 3D-модели со всех сторон.Из этого урока вы узнаете, как в CopperCube создать простое приложение для просмотра 3D-моделей, в котором, используя управление мышью, можно рассматривать 3D-модели со всех сторон.
После того, как вы настроили свою сцену, к важной части: нам нужен контроллер камеры, который может перемещаться по зданию в середине сцены и показывать здание со всех сторон.После того, как вы настроили свою сцену, перейдём к самой важной части: нам нужен контроллер камеры, который может перемещаться вокруг здания в середине сцены и показывать это здание со всех сторон.
Для этого просто создайте новую камеру. Для этого нажмите на вкладку 'Create' «Создать» и кликните значок с изображением камеры (в качестве альтернативы используйте меню: 'Edit -> Insert -> Create a Camera' «Правка -> Вставить -> Создать камеру»).Два раза подряд "для этого", надо как-то разгрести... например, так:
Вот, как это должно выглядеть:Вот как это должно выглядеть:
Это связано с тем, что камера всегда находится на постоянном расстояние радиуса желтой сферы от центра.Это связано с тем, что камера всегда находится от центра на постоянном расстоянии, равном радиусу желтой сферы.
« Ответ #34 : 01 Май 2019, 16:28:55 »
Урок: Создание просмотровщика 3D-модели
« : 02 Май 2019, 15:09:39 »
Урок: Использование камеры от третьего лица
« : 02 Май 2019, 19:02:39 »
Урок: Создание 3D-конфигуратора
Кроме того, если вы не хотите чтобы клерк мог проходить сквозь стены, то добавьте к нему поведение 'Collide when moved' «Столкновение при перемещении».Кроме того, если вы не хотите, чтобы клерк мог проходить сквозь стены, то добавьте к нему поведение 'Collide when moved' «Столкновение при перемещении».
Когда вы это сделаете, обязательно отрегулируйте желтый эллипсоид так чтобы он окружал клерка и не застревал в стенах или в полу.Когда вы это сделаете, обязательно отрегулируйте желтый эллипсоид так, чтобы он окружал клерка и не застревал в стенах или в полу.
Конечно, вы не обязаны использовать анимированного персонажа типа клерк, для модели, которой хотите управлять, и следите за ней с помощью камеры от третьего лица.Конечно, вы не обязаны использовать анимированного персонажа типа клерк для модели, которой хотите управлять и следить за ней с помощью камеры от третьего лица.
Также вам будет предложено выбрать объект за котором она должна следовать.Также вам будет предложено выбрать объект, за которым она должна следовать.
Камера от третьего лица расположенная позади персонажаКамера от третьего лица, расположенная позади персонажа
Теперь вы также можете настроить некоторые значения, такие как 'FollowMode' «Режим следования», 'FollowSmoothingSpeed' « Сглаживание скорости следования» и если камера не должна проходить сквозь стены 'CollideWithWorld' «Сталкиваться с миром».Теперь вы также можете настроить некоторые значения, такие как 'FollowMode' «Режим следования», 'FollowSmoothingSpeed' « Сглаживание скорости следования» и, если камера не должна проходить сквозь стены, 'CollideWithWorld' «Сталкиваться с миром».
Остапа понесло.Бывает ;D
/* <action jsname="action_MovePosition" description="Move Position">
<property name="MoveBy" type="vect3d" default="0.0, 5.0, 0.0" />
</action>
*/
action_MovePosition = function()
{
};
// вызывается при выполнении действия
action_MovePosition.prototype.execute = function(currentNode)
{
var oldPos = ccbGetSceneNodeProperty(currentNode, "Position");
var newPos = oldPos.add(this.MoveBy);
ccbSetSceneNodeProperty(currentNode, "Position", newPos);
}
/* <action jsname="action_MovePosition" description="Move Position">
<property name="MoveBy" type="vect3d" default="0.0, 5.0, 0.0" />
</action>
*/
/* <action jsname="action_MovePosition" description="Move Position">
<property name="MoveBy" type="vect3d" default="0.0, 5.0, 0.0" />
<property name="MoveWhat" type="scenenode" />
<property name="TestColor" type="color" default="ff00ff00" />
<property name="TestText" type="string" default="Hello World!" />
</action>
*/
action_MovePosition = function()
{
};
// вызывается при выполнении действия
action_MovePosition.prototype.execute = function(currentNode)
{
var oldPos = ccbGetSceneNodeProperty(this.MoveWhat, "Position");
var newPos = oldPos.add(this.MoveBy);
ccbSetSceneNodeProperty(this.MoveWhat, "Position", newPos);
}
<action jsname="action_MovePosition" description="Move Position">
...
action_MovePosition = function()
{
};
// вызывается при выполнении действия
action_MovePosition.prototype.execute = function(currentNode)
{
var oldPos = ccbGetSceneNodeProperty(this.MoveWhat, "Position");
var newPos = oldPos.add(this.MoveBy);
ccbSetSceneNodeProperty(this.MoveWhat, "Position", newPos);
}
Из этого урока вы узнаете как использовать поведения и действия для создания простого 3D-конфигуратора в CopperCube.Из этого урока вы узнаете, как использовать поведения и действия для создания простого 3D-конфигуратора в CopperCube.
Недавно созданная камера с целью направленной на 3D-модельНедавно созданная камера с целью, направленной на 3D-модель
Теперь нам нужны кнопки на которые пользователь сможет нажать.Теперь нам нужны кнопки, на которые пользователь сможет нажать.
Поэтому мы просто создадим 2 билборда (используйте вкладку 'Create' «Создать» и нажмите значок 'Create a Billboard' «Создать билборд», либо через меню 'Edit -> Insert -> Create a Billboard' «Редактировать -> Вставить -> Создать билборд») и разместим их тех в трехмерных позициях, в которые должна перемещаться камера, когда пользователь нажимает на одну из двух кнопок:Поэтому мы просто создадим 2 билборда (используйте вкладку 'Create' «Создать» и нажмите значок 'Create a Billboard' «Создать билборд», либо через меню 'Edit -> Insert -> Create a Billboard' «Редактировать -> Вставить -> Создать билборд») и разместим их в тех трехмерных позициях, в которые должна перемещаться камера, когда пользователь нажимает на одну из двух кнопок:
Билборды отмечающие 3D-позиции камерыБилборды, отмечающие 3D-позиции камеры
Новое поведение будет добавлено и выглядеть так:Добавится новое поведение, и оно будет выглядеть так:
Новое действие будет добавлено и выглядеть так:Добавится новое действие, и оно будет выглядеть так:
Надеюсь, вы заметили, что добавить поведение и действие к 2D-наложению, действительно легко.Надеюсь, вы заметили, что добавить поведение и действие к 2D-наложению действительно легко.
/*
<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;
}
behavior_moveBetweenPoints = function()
{
this.LastTime = null;
this.StartPoint = null;
};
behavior_moveBetweenPoints.prototype.onAnimate = function(node, timeMs)
{
...
}
// параметры: клавиша: код клавиши которая нажата или отпущена
// нажатие: true (истина) если клавиша нажата, false (ложь) если отпущена
behavior_moveBetweenPoints.prototype.onKeyEvent = function(key, pressed)
{
if (key == 32) // клавиша 'Пробел'
{
if (pressed)
this.Speed = 0.02;
else
this.Speed = 0.0;
}
}
// mouseEvent (событие мыши): 0=мышь движется, 1=движется колёсико мыши, 2=левая кнопка мыши отпущена,
// 3=левая кнопка мыши нажата, 4=правая кнопка мыши отпущена, 5=правая кнопка мыши нажата
behavior_moveBetweenPoints.prototype.onMouseEvent
= function(mouseEvent, mouseWheelDelta)
{
// здесь обработка событий мыши
}
// используем текущий выбранный в редакторе узел
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);
}
Самым простым дополнением CopperCube, является программирование сценария действия.Проще всего создать расширение для CopperCube - запрограммировать сценарий действия.
Если вы перезапустите CopperCube, то будет доступно новое действие с именем «Move Position».Если вы перезапустите CopperCube, то новое действие с именем «Move Position» станет доступным.
Поскольку мы изменили код JavaScript, чтобы использовать свойство 'MoveWhat' «Что двигать» для изменения положения узла сцены, теперь вам нужно выбрать узел сцены в свойстве 'MoveWhat', на который следует повлиять.Поскольку мы изменили код JavaScript так, чтобы в нём использовалось свойство 'MoveWhat' «Что двигать» для изменения положения узла сцены, теперь вам нужно в редакторе в свойстве 'MoveWhat' выбрать узел сцены, на который следует повлиять.
Что такое "Действие", и что такое "Поведение", и чем они отличаются?Я пока ещё не дошел до перевода этого, да и толком об этом в справке нет... Вот чего пишут и как я понял:
CopperCube включает в себя несколько поведений и действий, которые могут быть добавлены к любому трехмерному и двумерному объекту в сцене. Благодаря этому, возможно не только анимировать трехмерные объекты, но и добавить интерактивность вашему трехмерному приложению: реагирование на нажатия клавиш и кнопок, воспроизведение звуков или даже создание игровых персонажей, контролируемых искусственным ителлектом (AI).
CopperCube включает в себя несколько действий, которые могут быть вызваны поведением и другими действиями. С их помощью можно не только анимировать трехмерные объекты, но и добавить интерактивность вашему трехмерному приложению: реагирование на нажатия клавиш и кнопок, воспроизведение звуков или даже создание игровых персонажей, контролируемых ИИ.
Походу, действия - это более простые расширения CopperCube, чем более комплексные поведения.Ну, ладно, пока будем так считать.
В конструкторе мы инициализируем две переменные, которые нам понадобятся позже: вторая - это значение времени, когда поведение было запущено, чтобы мы могли плавно перемещать куб, независимо от текущей частоты кадров, и первая - это точка узла сцены, к которому привязано данное поведение, в данном случае куб.В конструкторе мы инициализируем две переменные, которые нам понадобятся позже: this.LastTime - значение времени последнего раза, когда это поведение было выполнено, чтобы мы могли плавно перемещать куб независимо от текущей частоты кадров, и this.StartPoint - начальное положение узла сцены, к которому привязано данное поведение, в данном случае куба.
Мы используем это, чтобы иметь возможность плавно перемещать куб: каждый раз мы сохраняем текущее время в которое вызвали функцию, чтобы рассчитать разницу во времени между этим и последним вызовом, и соответствующим образом переместить узел сцены.Мы используем его, чтобы иметь возможность плавно перемещать куб: каждый раз мы сохраняем текущее время, в которое функция была вызвана, чтобы рассчитать разницу во времени между этим и прошлым вызовом, и соответствующим образом переместить узел сцены.
Да, грубейшая ошибка из-за моей невнимательности и незнания JavaScript. Поправил. Спасибо!ЦитироватьВ конструкторе мы инициализируем две переменные, которые нам понадобятся позже: вторая - это значение времени, когда поведение было запущено, чтобы мы могли плавно перемещать куб, независимо от текущей частоты кадров, и первая - это точка узла сцены, к которому привязано данное поведение, в данном случае куб.В конструкторе мы инициализируем две переменные, которые нам понадобятся позже: this.LastTime - значение времени последнего раза, когда это поведение было выполнено, чтобы мы могли плавно перемещать куб независимо от текущей частоты кадров, и this.StartPoint - начальное положение узла сцены, к которому привязано данное поведение, в данном случае куба.
Хрен его знает. Вот, в другом 2D-конструкторе Stencil, тоже применяют понятие "поведение": http://www.stencyl.com/help/view/introduction-to-behaviors/ (http://blender-3d.ru/forum/go.php?url=aHR0cDovL3d3dy5zdGVuY3lsLmNvbS9oZWxwL3ZpZXcvaW50cm9kdWN0aW9uLXRvLWJlaGF2aW9ycy8=)ЦитироватьПоходу, действия - это более простые расширения CopperCube, чем более комплексные поведения.Ну, ладно, пока будем так считать.
Поведения - это настраиваемые «способности», которые вы прикрепляете к типам актеров или сценам. Вместе они составляют «мозги» игры, обрабатывая все взаимодействия, происходящие в игровом мире.
// регистрируем события клавиатуры
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);
}
}
// регистрируем событие рисования
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);
}
Опубликуйте его как файл 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'.
var root = ccbGetRootSceneNode();
var shadowAreEnabled = ccbGetSceneNodeProperty(root, "Realtime Shadows");
ccbSetSceneNodeProperty(root, "Realtime Shadows", !shadowAreEnabled);
После этого станут видимы другие настройки для теней, которые описаны ниже. Вам потребуется немного их настроить, чтобы тени в вашей сцене выглядели более привлекательно. Для простого теста динамических теней вы можете использовать пустую сцену и вставить в нее ландшафт: нажмите "Edit -> Insert Terrain -> OK" «Правка -> Вставить ландшафт -> ОК».Заменено на:
CopperCube поддерживает рендеринг местности, и обладает редактором для создания её ландшафта, растений, травы и многого другого.CopperCube поддерживает рендеринг местности и обладает редактором для создания её ландшафта, растений, травы и многого другого.
Flatten tool (Инструмент сплющивания):Flatten tool (Инструмент выравнивания):
Если вы хотите добавить свои собственные меши на ландшафт местности, например, дома или аналогичные объекты, и эффективно их сортировать, чтобы ускорить запуск вашей игры или приложения, то можете сделать это легко:как я понимаю, под and have them culled effiently in order здесь имеется ввиду, что эти объекты будут обрабатываться совместно с местностью, со всеми её оптимизациями, так что можно попробовать так перевести:
Это очень гибкий инструмент, и некоторые текстуры, включенные в сцену примера местности в CopperCube, основаны на текстурах созданных с помощью Genetica.Это очень гибкий инструмент, и некоторые текстуры, включенные в сцену примера местности в CopperCube, основаны на текстурах, созданных с помощью Genetica.
Если вы используете большее разрешение карты высот, то получите более огромный мир.Если вы используете большее разрешение карты высот, то получите слишком огромный мир.
Чтобы включить рендеринг в тумана, просто установите флажок в окне свойств корневого узла сцены:Чтобы включить рендеринг в тумане, просто установите флажок в окне свойств корневого узла сцены:
Платформа Flash (старые версии CopperCube 5.x) не поддерживает рендеринг тумана. Всё рендерится без тумана.Платформа Flash (старые версии CopperCube 5.x) не поддерживает рендеринг тумана. В ней всё будет рендериться без тумана.
Чтобы включить отображение динамических теней, выберете корневой узел в вашей сцене, и в окне свойств, установите флажок "Realtime Shadows" «Динамические тени»:Чтобы включить отображение динамических теней, выберете корневой узел в вашей сцене, и в окне свойств установите флажок "Realtime Shadows" «Динамические тени»:
Вам потребуется немного их настроить, чтобы тени в вашей сцене выглядели более привлекательно.Вам потребуется их поднастроить, чтобы тени в вашей сцене выглядели более привлекательно.
Динамические тени на объектах будут отображаться только тогда, когда на вкладке их материала установилен тип освещения "Dynamic" «Динамический» .Динамические тени на объектах будут отображаться только тогда, когда на вкладке их материала установлен тип освещения "Dynamic" «Динамический».
На том кубе, который находится в левом нижнем углу, установлен режим освещения "None" «Без освещения», поэтому он не будет освещен и не будет отображать динамические тени:На том кубе, который находится в левом нижнем углу, установлен режим освещения "None" «Без освещения», поэтому для него не будет просчитываться освещение, и на нём не будут отображаться динамические тени:
Чем меньше площадь этой области, тем детальнее будут тени находящиеся рядом с камерой.Чем меньше площадь этой области, тем детальнее будут тени, находящиеся рядом с камерой.
Кроме того, есть три других доступных значения, которые можно использовать для настройки того, как тени визуализируются в сцене.Кроме того, доступны три других значения, которые можно использовать для настройки визуализации теней в сцене.
P.S. Возможно стоит использовать "Динамичные тени" вместо "Динамические тени". Как думаешь, Striver?Я за "Динамические тени", хотя тут тебе решать... Но уж точно желательно переводить одинаково Динамичный-Динамический и Статичный-Статический, поэтому:
Поскольку CopperCube также поддерживает статичное освещение (карта освещения), то можно использовать оба метода освещения в одной и той же сцене:Поскольку CopperCube также поддерживает статическое освещение (карта освещения), то можно использовать оба метода освещения в одной и той же сцене:
Вам нужно только указать тип освещения "Lightmapping" «Статичный (карта освещения)» в материале для объектов, которые должны быть статично освещены, и "Dynamic" «Динамический» для объектов, которые должны быть освещены с использованием динамических теней.Вам нужно только указать тип освещения "Lightmapping" «Статический (карта освещения)» в материале для объектов, которые должны быть статично освещены, и "Dynamic" «Динамический» для объектов, которые должны быть освещены с использованием динамических теней.
Обратите внимание, что в настоящее время невозможно отображать динамические тени на объектах, на которых есть карты освещения, и наоборот.Обратите внимание, что в настоящее время невозможно отображать динамические тени на объектах, у которых включены карты освещения, и наоборот.
Примечание: При использовании целевой платформы Flash (.swf) (старые версии 5.х) CopperCube поддерживает воспроизведение только файлов .mp3. При использовании целевой платформы Windows (.exe) проигрыватель поддерживает все форматы файлов, кроме файлов .mp3.Вот, блин, геморрой-то...
Если вы выбирали не поддерживаемый формат файла и опубликовали свою сцену, то CopperCube напечатает предупреждение.Если вы выбрали не поддерживаемый формат файла и опубликовали свою сцену, то CopperCube напечатает предупреждение.
Вы можете выбрать, должен ли звук не проигрываться (nothing), повторяться (looping), воспроизводиться только один раз (Play_once) или воспроизводиться в случайном порядке (random).Вы можете выбрать, должен ли звук не проигрываться (nothing), повторяться (looping), воспроизводиться только один раз (Play_once) или воспроизводиться случайным образом (random).
Внутри этого радиуса звук воспроизводится с максимальной громкостью, а вне радиуса звук будет более тихим, по мере удаления слушателя (активной камеры).Внутри этого радиуса звук воспроизводится с максимальной громкостью, а вне радиуса звук будет становиться всё тише по мере удаления слушателя (активной камеры).
Как вариант, аудиоплейер Aimp (https://www.aimp.ru), он умеет пакетно конвертировать звуковые файлы: "ПКМ на выделенных файлах -> Отправить файлы -> Аудиоконвертер"ЦитироватьПримечание: При использовании целевой платформы Flash (.swf) (старые версии 5.х) CopperCube поддерживает воспроизведение только файлов .mp3. При использовании целевой платформы Windows (.exe) проигрыватель поддерживает все форматы файлов, кроме файлов .mp3.Вот, блин, геморрой-то...
ccbSetSceneNodeProperty(ccbGetRootSceneNode(), "Bloom", true);
Чтобы включить эффекты, просто выберите меню "Scenes -> Scene Post Effects" «Сцена -> Эффекты постабработки сцены» и затем установите флажок на против любого из перечисленных эффектов.Чтобы включить эффекты, просто выберите меню "Scenes -> Scene Post Effects" «Сцена -> Эффекты постабработки сцены» и затем установите флажок напротив любого из перечисленных эффектов.
Влияет, насколько сильно размыто свечение.Влияет на то, насколько сильно размыто свечение.
Например, используйте 0.4, чтобы светилось много светлых областей, и 0.9, чтобы использовать для свечения только очень яркие области.Например, используйте 0.4, чтобы светилось много светлых областей, и 0.9, чтобы использовать для свечения только очень яркие областей.
Эффекты постобработки работают на WebGL, но если браузер поддерживает только WebGL 1, то они будут выглядеть такими чёткими, поскольку WebGL 1 не поддерживает рендеринг не в степени двойки.Эффекты постобработки работают на WebGL, но если браузер поддерживает только WebGL 1, то они не будут выглядеть резкими, поскольку WebGL 1 не поддерживает цели рендеринга, отличные от степени двойки.
Он будут выглядеть так же, как на Windows .exe и других платформах, когда браузер поддерживает WebGL 2Они будут выглядеть так же, как на Windows .exe и других платформах, если браузер поддерживает WebGL 2.
Сцена теперь должна примерно выглядеть так:Сцена теперь должна выглядеть примерно так:
Если вы хотите проверить приблизительное освещение от источников света, то можете переключиться в режим 'Diffuse' «Диффузное», который не рассчитывает тени, но очень быстр.Если вы хотите грубо оценить освещение от источников света, то можете переключиться в режим 'Diffuse' «Диффузное», который не рассчитывает тени, но очень быстр.
var s = ccbGetSceneNodeFromName("ВашаМодель");
ccbSetSceneNodeProperty(s, "AnimationBlending", false);
Я не особо соображаю в векторной алгебре и высшей математике, потому, поправь термины, пожалуйста, Striver, если они неверны.Если ты имеешь ввиду термины binormals and tangents, то, боюсь, я тоже не очень понимаю, что это такое. tangents может быть в равной степени тангенсом или касательной. Слово binormals мне раньше вообще не попадалось. Подозреваю, что эти термины тут являются специфичными внутренними для движка Coppercube (или, например, Irrlicht). Как вариант, можно их оставить в английском написании, чтобы снять с себя ответственность.
Это делается с помощью анимированного скелета прикреплённого к "коже" (Skin) ,то есть к полигональной сетке (или мешу), состоящей из вершин.Это делается с помощью анимированного скелета, прикреплённого к "коже" (Skin), то есть к полигональной сетке (или мешу), состоящей из вершин.
Вы можете моделировать и анимировать персонажи с помощью любого трехмерного программного обеспечения, затем экспортируя его в один из следующих форматов файлов и импортируя их в Coppercube:Вы можете моделировать и анимировать персонажи с помощью любого трехмерного программного обеспечения, затем экспортировать его в один из следующих форматов файлов, и импортировать в Coppercube:
После определения интервалов этой анимации, ее можно выбрать в окне свойств анимированной полигональной сетки для воспроизведения или с помощью setSceneNodeAnimation(node, "walk") в ActionScript 3 (Старые версии CopperCube 5.х с поддержкой Flash), или ccbSetSceneNodeProperty(sceneNode, "Animation", "walk") с использованием JavaScript ,После определения интервалов этой анимации, её можно выбрать в окне свойств анимированной полигональной сетки для воспроизведения или с помощью функции setSceneNodeAnimation(node, "walk") в ActionScript 3 (Старые версии CopperCube 5.х с поддержкой Flash), или ccbSetSceneNodeProperty(sceneNode, "Animation", "walk") в JavaScript.
Движок будет автоматически смешивать неподходящие анимационные циклы, чтобы они выглядели достаточно хорошо.Движок будет автоматически смешивать недостаточно подогнанные анимационные циклы, чтобы они выглядели хорошо.
Вы можете прикрепить что угодно к анимированной полигональной сетке, от других полигоналиных сеток, до билбордов и систем частиц.Вы можете прикрепить что угодно к анимированной полигональной сетке, от других полигональных сеток, до билбордов и систем частиц.
CopperCube -import:somefile.3ds -save:myscene.ccb -publish:WebGL -quit
Карты нормалейОставил, как выкладывал на форум.
О, класс! Ошибок не вижу.ЦитироватьЯ не особо соображаю в векторной алгебре и высшей математике, потому, поправь термины, пожалуйста, Striver, если они неверны.Если ты имеешь ввиду термины binormals and tangents, то, боюсь, я тоже не очень понимаю, что это такое. tangents может быть в равной степени тангенсом или касательной. Слово binormals мне раньше вообще не попадалось. Подозреваю, что эти термины тут являются специфичными внутренними для движка Coppercube (или, например, Irrlicht). Как вариант, можно их оставить в английском написании, чтобы снять с себя ответственность.
Кстати, Striver. Как желаешь указать своё участие в переводе, и как это лучше сформулировать?Да, в принципе, меня можно не упоминать, моя ленивая задница тут почти ничего не делала.
Варианты:
Перевод на русский: Samovar и Striver специально для форумчан (жителей?) и гостей форума http://blender-3d.ru/forum
Перевод на русский: Samovar под редакцией Striver специально для форумчан (жителей?) и гостей форума http://blender-3d.ru/forum
Иное?
специально для форумчан (жителей?) и гостей форуману, раз уж тут на форуме почти под всеми псевдонимами стоит слово "житель", логично так и писать...
Но мне не особо охота, что бы этот перевод распространялся людьми (репостился на иных сайтах) целиком без нашего ведома, или частично, без указания ссылок на форум http://blender-3d.ru/forum и твой сайт как одного из его авторов... и тем более я не желаю, что бы кто-то продавал его или изменял, приписывая себе авторство...В нынешних реалиях Интернета, если ты всего этого не хочешь, то надо срочно удалять всю эту ветку, пока кто-нибудь не успел себе скопировать, и больше никому не давать / нигде не выкладывать. Но, скорее всего, уже поздно :) . Книжки с моими переводами я находил на самых разных
Или просто указать авторов перевода и всё, т.к. согласия на перевод этой справки на русский нам никто не давал (значит и прав на перевод у нас особых нет, в соответствии с ГК РФ)? Или стоит написать разработчикам CopperCube и спросить письменного их разрешения? Упаковать всё в инсталятор с лицензионным соглашением :) Либо, вообще не парится ? :)А вот в лицензиях (как и во всём юризме в целом) я ничего не понимаю, тут я тебе не советчик. Большинство-то моих переводов были откровенно пираЦЦкие...
Если вы переместили часть статической геометрии и хотите чтобы физический движок учитывал это, то запустите команду JavaScript ccbUpdatePhysicsGeometry().Если вы переместили часть статической геометрии и хотите, чтобы физический движок учитывал это, то запустите команду JavaScript ccbUpdatePhysicsGeometry().
CopperCube поддерживает набор ресурсов, для быстрого доступа к готовым 3D-объектам.CopperCube поддерживает набор ресурсов для быстрого доступа к готовым 3D-объектам.
Создавать свои собственные ресурсы довольно просто: просто экспортируйте свою файл CopperCube как ресурс CopperCube, используя меню 'File -> Export -> Save current file as CopperCube Prefab' «Файл -> Экспорт -> Сохранить текущий файл как ресурс CopperCube».Создавать свои собственные ресурсы довольно просто: просто экспортируйте свой файл CopperCube как ресурс CopperCube, используя меню 'File -> Export -> Save current file as CopperCube Prefab' «Файл -> Экспорт -> Сохранить текущий файл как ресурс CopperCube».
Если вы хотите создать каталог ресурсов для использования другими людьми, убедитесь, что все текстуры, используемые ресурсами, включены в каталог ресурсов, и чтобы ни один из ваших ресурсов не ссылался на текстуру с локального жесткого диска не включенную в архив, который вы решили распространять.Если вы хотите создать каталог ресурсов для использования другими людьми, убедитесь, что все текстуры, используемые ресурсами, включены в каталог ресурсов, и чтобы ни один из ваших ресурсов не ссылался на текстуру на локальном жестком диске, которая не включена в распространяемый вами архив.
Скопируйте в каталог «textures» все текстуры, которые вы собираетесь использовать вместе с ресурсам.Скопируйте в каталог «textures» все текстуры, которые вы собираетесь использовать вместе с ресурсами.
В CopperCube присвойте объектам только текстуры из этого каталога.В CopperCube присвойте объектам текстуры только из этого каталога.
Подобно созданию значка, вы также можете добавить информацию об авторских правах в ваш ресурс.Подобно созданию значка, вы также можете добавить в ваш ресурс информацию об авторских правах.
Профессиональная версия CopperCube включает в себя возможность для воспроизведения видео на платформах Windows .exe и WebGL.Странно, что МакОС остался в пролёте
Можно влиять на воспроизведение с помощью действий (play/stop/pause "воспроизведение / остановка / пауза") и реагировать, когда воспроизведение видео закончилось или не удалось.Можно влиять на воспроизведение с помощью действий (play/stop/pause "воспроизведение / остановка / пауза") и реагировать, когда воспроизведение видео закончилось или вообще не запустилось.
Создайте узел сцены на котором хотите отображать видео.Создайте узел сцены, на котором хотите отображать видео.
Вы можете загрузить и установить дополнительные, а стандартные по умолчанию работают с основными видеоформатами, такими как MPEG-1 и MPEG-2.Чем больше я всякой фигни перевожу, тем чаще мне слово "basic" хочется перевести не как "основной" (или даже совсем тупо "базовый"), а как "примитивный". Этот случай кажется именно таким. (Не подумайте, что я имею что-то против языка программирования Бэйсик :) ). Но всё-таки пусть будет так:
При воспроизведении видео, частота кадров вашего приложения должна быть высокой, чтобы синхронизировать его со звуком.При воспроизведении видео частота кадров вашего приложения должна быть высокой, чтобы синхронизировать его со звуком.
Примечание: используйте опцию -save, чтобы сохранить документ перед тем как CopperCube его опубликует.Примечание: используйте опцию -save, чтобы сохранить документ перед тем, как CopperCube его опубликует.
Обычно всё работает, но и возникнуть ошибки.Обычно всё работает, но могут возникнуть и ошибки.
yourapplication.exe -windowed
yourapplication.exe -debug -script:myscript.js
print("Всем привет!");
Да, в принципе, меня можно не упоминать, моя ленивая задница тут почти ничего не делала.А вот это ты зря :) Ты для меня авторитет и учитель (я учился Блендеру по некоторым из твоих переводов)... и даже если эти мои деферамбы к тебе опустить, то ты мне очень помогаешь, указывая на мои грамматические и синтаксические ошибки (странно, но я никогда не любил русский и литературу в школе, и у меня по этим предметам всегда были посредственные оценки) , постя свои сообщения в этой теме. Это меня нехило мотивирует продолжать перевод. Ты для меня как "волшебный пендель", стимулирующий меня завершить начатое :) А что до лени, то смею тебя уверить, что у меня её раз в 10 больше, чем у тебя...
А вот в лицензиях (как и во всём юризме в целом) я ничего не понимаю, тут я тебе не советчик. Большинство-то моих переводов были откровенно пираЦЦкие...Честно скажу, что в одно время меня это сподвигло уйти с 3ds max на Блендер... но всё оказалось тоже не просто :) Я тоже не шарю в юрисприденции :) Просто хотелось находится хоть в каком-то правовом поле... Кстати, не переживай, я тоже "пират"... ребята - разработчики CopperCube явно об этом по нагличански пишут тут https://www.ambiera.com/terms_and_conditions.html (http://blender-3d.ru/forum/go.php?url=aHR0cHM6Ly93d3cuYW1iaWVyYS5jb20vdGVybXNfYW5kX2NvbmRpdGlvbnMuaHRtbA==)
Copy, reproduction or distribution of the software, source, documentation and images to any other location is expressly prohibited.Копирование, воспроизведение или распространение программного обеспечения, исходного кода, документации и изображений в любое другое место категорически запрещено
9. Jurisdiction and Choice of Law
Insofar as not otherwise agreed, this Agreement shall be governed exclusively by Austrian law. Austrian law shall also be applied in case of you reside outside of Austria. You expressly agree that exclusive jurisdiction for any claim or dispute with Ambiera linked in any way to your use of its services resides in the competent court in the town of Vienna, Austria.
Какими прогами ты пользуешься, создавая переводы?Вот даже не знаю, что ответить... Пишу в LibreOffice, обычно по одному файлу на главу, потому что если делать сразу весь текст на несколько сотен страниц, то случаются страшные тормоза. Потом их всё-таки сливаю в один файл, но уже когда всё доделано. Оттуда уже экспортирую в нужные форматы. В PDF и HTML сразу есть экспорт, а вот если присписчит с FB2 заморочиться (последний раз было лениво уже, забил на это), то тогда открываю старенький OpenOffice3, для него существует экспортёр OOoFBTools.
Вот с PDF у меня ваще всегда засада... не берусь за них, потому что не знаю как их привести в порядок для редактирования, обычно выходит какая-то неудобоваримая каша при импорте в Open Office, Corel Draw или InkScapeЯ когда-то пытался отдельными конверторами в вордовский формат преобразовывать, но обычно получался такой кошмар, что выкидывал результат. Просто стал из читалки копировать по одному абзацу, и работать с ним.
Чем больше я всякой фигни перевожу, тем чаще мне слово "basic" хочется перевести не как "основной" (или даже совсем тупо "базовый"), а как "примитивный". Этот случай кажется именно таким. (Не подумайте, что я имею что-то против языка программирования Бэйсик :) ).Бейсик - Бейсику рознь :) Если говорить о современных его диалектах, то на халявном Freebasic и коммерческом Purebasic, можно писать серьёзные проги и игры под Windows и Linux, которые ничуть не будут уступать аналогичным прогам на Cи и его диалектам Cи++ и т.д. Это компиляторы, которые генерят шустрый машинный код (и иногда он даже выходит шустрей, чем аналогичный Си и С++) , но проще и понятней для новичков, чем интерпретируемые Си-подобные языки, и прочая заточенная под ООП интерпретируемая сценарная муть для сисадминов а-ля Python, JavaScript, LUA и т.д... Python с его требованиями к форматированию - это ваще какая-то чушь и детский сад "сопельки", если знаешь английский язык, который навязывает всем свой шаблон :) Если говорить о вреде и пользе, то изучение новичками Python более вредно, чем изучение ими Basic, если они хотят развиваться дальше как программисты и шарить в машинном коде (то есть в ассемблере), и в том, как всё устроено в компах...
Python с его требованиями к форматированию - это ваще какая-то чушь и детский сад "сопельки", если знаешь английский язык, который навязывает всем свой шаблон :) Если говорить о вреде и пользе, то изучение новичками Python более вредно, чем изучение ими BasicВот не хотелось бы скатиться до разборок
Если говорить о современных его диалектах, то на халявном Freebasic и коммерческом Purebasic, можно писать серьёзные проги и игры под Windows и Linux, которые ничуть не будут уступать аналогичным прогам на Cи и его диалектам Cи++ и т.д.Это прекрасно, и у меня нет причин сомневаться в этом утверждении, но тоже самое можно сказать практически о любом языке, который существует более 10 (а иногда и меньше) лет (в том числе и о Питоне).
Обратите внимание, что при создании приложения с помощью этой функции вы несёте ответственность за возможный ущерб нанесённый людям вашим приложением.Обратите внимание, что при создании приложения с помощью этой функции вы несёте ответственность за возможный ущерб, нанесённый людям вашим приложением.
Скорость очень важна, так как сцена визуализируется дважды, немного замедляя всё.Скорость очень важна, так как сцена визуализируется дважды, отчего всё немного замедляется.
Что-то куда-то не в ту сторону в разговоре свернули... Возвращаемся.Хорошо. Молчу. Хватит лирических отступлений. Далее только по теме... Спасибо. Поправил.
Если вы хотите быстро проверить код, который только что изменили при создании вашего действия или поведения, то используйте "Edit -> Plugins -> Reload and Verify Extensions" «Правка -> Дополнения -> Перезагрузить и проверить расширения», чтобы проверить, является ли ваше действие допустимым, и компилятор JavaScript принимает ваш код.Если вы хотите быстро проверить код, который только что изменили при создании вашего действия или поведения, то используйте "Edit -> Plugins -> Reload and Verify Extensions" «Правка -> Дополнения -> Перезагрузить и проверить расширения», чтобы проверить, является ли ваше действие допустимым, и что компилятор JavaScript принимает ваш код.
При запуске приложения созданного под платформы Windows .exe или Mac OS X .app, в CopperCube будет отображаться окно отладки со всеми возникающими ошибками.При запуске приложения, созданного под платформы Windows .exe или Mac OS X .app, в CopperCube будет отображаться окно отладки со всеми возникающими ошибками.
Загрузка расширенийТеперь тебе придётся перевести ещё и эту страничку с описаниями расширений... :)
Если вы не хотите изучать программирование, то вы можете загрузить расширения, созданные другими пользователями. Они доступны на официальном сайте:
Скачать сценарии поведений
Скачать сценарии действий
В общем, не трож Бейсик и я не буду тягать Питона за хвост...Так я ж с самого начала написал, что ничего против Бэйсика не имею.
Теперь тебе придётся перевести ещё и эту страничку с описаниями расширений... :)Это в планах после завершения перевода основной справки... после того как переведу API, стану больше разбираться в программируемом функционале...
Ниже будет использовать файл сценария «myscript.js» вместо скомпилированного внутри приложения, и покажет консоль отладки, если какая-либо строка текста будет напечатана в вашем сценарии.Следующая команда будет использовать файл сценария «myscript.js» вместо скомпилированного внутри приложения, и покажет консоль отладки, если какая-либо строка текста будет напечатана в вашем сценарии.
При публикации вашего файла с как приложения Windows .exe, CopperCube включит этот сценарий в файл .exe и будет использовать его в качестве основного сценария.При публикации вашего файла как приложения Windows .exe, CopperCube включит этот сценарий в файл .exe и будет использовать его в качестве основного сценария.
Чтобы протестировать его и разрабатывать свою игру, сделайте следующее:Чтобы протестировать эту интеграцию, и разрабатывать с ней свою игру, сделайте следующее:
Создайте в этом каталоге текстовый файл с именем «steam_appid.txt», добавив в качестве текстового контента ваш магазин в Steam.Создайте в этом каталоге текстовый файл с именем «steam_appid.txt», добавив в качестве текстового контента ваш appid (идентификатор приложения) в магазине Steam.
Полноэкранный режим теперь будет автоматически изменятся в соответствии с разрешением экрана пользователя.Полноэкранный режим теперь будет автоматически изменяться в соответствии с разрешением экрана пользователя.
Переключение между игрой и другими приложениями станут очень быстрым.Переключение между игрой и другими приложениями станет очень быстрым.
Теперь можно перейти в полноэкранный режим, нажав на окне кнопку «Развернуть».Можно переходить в полноэкранный режим, нажав у окна кнопку «Развернуть».
При публикации вашего приложения, CopperCube создаст папку с именем «dxredist», в паке где находится ваше приложение.При публикации вашего приложения CopperCube создаст папку с именем «dxredist» там же, где находится ваше приложение.
Благодаря этому, возможно не только анимировать трехмерные объекты, но и добавить интерактивность вашему трехмерному приложению, такие как: реагирование на нажатия клавиш и кнопок, воспроизведение звуков или даже создание игровых персонажей, контролируемых искуственным ителлектом (AI).Благодаря этому возможно не только анимировать трехмерные объекты, но и добавить интерактивности вашему трехмерному приложению, например: реагирование на нажатия клавиш и кнопок, воспроизведение звуков или даже создание игровых персонажей, контролируемых искуственным ителлектом (AI).
3D-позиция определяющая положение начала линии.3D-позиция, определяющая положение начала линии.
3D-позиция определяющая положение конца линии.3D-позиция, определяющая положение конца линии.
Например, значение 10000, означает 10 секунд.Например, значение 10000 означает 10 секунд.
Интервал времени в миллисекундах, в течение которого узлу трехмерной сцены нужно переместится по всей траектории.Интервал времени в миллисекундах, в течение которого узлу трехмерной сцены нужно переместиться по всей траектории.
Когда установлен флажок LookIntoMovementDirection (Смотреть в направлении движения), это может быть использовано для дополнительного поворота, который используется для поворота узла сцены в правильном направлении вдоль пути.Когда установлен флажок LookIntoMovementDirection (Смотреть в направлении движения), этот параметр можно использовать для дополнительного поворота, чтобы отрегулировать направление взгляда узла сцены вдоль пути.
Очень сильно перелопатил предложение, возможно, стало неверно. Лучше перепроверь за мной это место.Потыкал эти параметры в редакторе, и нифига не заметил разницы... Пока оставил твой вариант.
Tomb Raider, ...Лариска 2006-го года на этой картинке кажется симпатиШнее остальных :)
Делает камеру активной, которую можно выбрать в дополнительном параметре Camera (Камера).Делает активной определённую камеру, которую можно выбрать в дополнительном параметре Camera (Камера).
Это поведение позволяет перемещать трехмерные объекты в трехмерном мире не пропуская их сквозь стены.Это поведение позволяет перемещать трехмерные объекты в трехмерном мире, не пропуская их сквозь стены.
Полезно, если вы используете столкновения для объектов имитирующих транспортные средства.Полезно, если вы используете столкновения для объектов, имитирующих транспортные средства.
Для предотвращения застревания, всегда размещайте 3D-объект в таком положении, чтобы вначале желтый эллипсоид не сталкивался со стенами.Для предотвращения застревания всегда размещайте 3D-объект в таком положении, чтобы желтый эллипсоид изначально не сталкивался со стенами.
Если используемое программное обеспечение для трехмерного моделирования поддерживает функцию слияния вершин, то рекомендуется сделать это.Если используемое программное обеспечение для трехмерного моделирования поддерживает функцию слияния вершин, то рекомендуется её выполнить.
Она может вращаться пользователем вокруг цели камеры путём перемещения мыши.Пользователь может вращать камеру вокруг цели посредством движения мыши.
Она может вращаться пользователем путём перемещения мыши и перемещаться путём нажатия им клавиш на клавиатуре.Пользователь может вращать камеру посредством движения мыши и передвигать с помощью нажатия клавиш на клавиатуре.
Скорость с которой камера поворачивается при перемещении мыши.Скорость, с которой камера поворачивается при перемещении мыши.
Максимальный угол на который камера может смотреть вверх и вниз.Максимальный угол, на который камера может смотреть вверх и вниз.
Если этот параметр активирован, то это не позволяет камере внезапно останавливаться при перемещении, когда пользователь отпустит клавишу перемещения.Если этот параметр активирован, то он не позволит камере внезапно останавливаться при перемещении, когда пользователь отпустит клавишу перемещения.
Этот параметр видно только если у вас есть 3D-модели, прикрепленные к камере как потомки.Этот параметр видно только в том случае, если у вас есть 3D-модели, прикрепленные к камере как потомки.
Например, когда это поведение связано с объектом, который имеет поведение "Object or Person controlled by keyboard" (Объект или персонаж контролируемый клавиатурой), вы можете создать камеру, похожую на игры с камерой от третьего лица, такие как "Tomb Raider".Например, когда это поведение связано с объектом, который имеет поведение "Object or Person controlled by keyboard" (Объект или персонаж контролируемый клавиатурой), вы можете создать камеру, аналогичную тем, что используются в играх с видом от третьего лица, таких как "Tomb Raider".
Дополнительная высота добавляемая к цели камеры.Дополнительная высота, добавляемая к цели камеры.
При клике мышью по трехмерному объекту, вместо проверки каждого многоугольника трехмерной модели, выполняется проверка столкновения только с его габаритным контейнером,.При клике мышью по трехмерному объекту, вместо проверки каждого многоугольника трехмерной модели будут проверены столкновения только с его габаритным контейнером.
Если этот флажок установлен (по умолчанию), то когда 3D-объект находится за геометрией другого 3D-объекта и пользователь кликает по нему, то ничего не происходит.Если этот флажок установлен (и по-умолчанию это так), то когда 3D-объект находится за геометрией другого 3D-объекта, а пользователь кликает по нему, то ничего не происходит.
Когда курсор перемещается над трехмерным объектом, вместо проверки каждого многоугольника трехмерной модели, выполняется проверка столкновения только с его габаритным контейнером,.Когда курсор перемещается над трехмерным объектом, вместо проверки каждого многоугольника трехмерной модели выполняется проверка столкновения только с его габаритным контейнером.
Если этот флажок установлен (по умолчанию), то когда 3D-объект находится за геометрией другого 3D-объекта и пользователь наводит курсор на него, то ничего не происходит.Если этот флажок установлен (и по-умолчанию это так), то когда 3D-объект находится за геометрией другого 3D-объекта, а пользователь наводит курсор на него, то ничего не происходит.
Определяет для чего должен проводится тест: для текущей активной (The current active camera) камеры или другого узла сцены (A scene node).Определяет, для чего должен проводится тест: для текущей активной (The current active camera) камеры или другого узла сцены (A scene node).
Поведение которое выполняет действие через определенный интервал времени.Поведение, которое выполняет действие через определенный интервал времени.
Здесь вы можете указать, будут ли изменены все текстуры 3D-объекта или только материал с определенным индексом (Material Index to change).Здесь вы можете указать, требуется ли изменить все текстуры 3D-объекта или только материал с определенным индексом (Material Index to change).
Текстура которая заменит предыдущую текстуру объекта через интервал времени.Текстура, которая заменит предыдущую текстуру объекта через интервал времени.
Это может быть достигнуто, например, с помощью действия 'Shoot' «Выстрел».Этого можно добиться, например, с помощью действия 'Shoot' «Выстрел».
Если поведение прикреплено к анимированной модели, то это указывает анимацию, воспроизводимую при ...Если поведение прикреплено к анимированной модели, то этот параметр определяет анимацию, воспроизводимую при ...
Например, используйте переменную с именем #player1.health для получения или изменения значения переменной хранящей здоровье объекта сцены с именем 'player1'.Например, используйте переменную с именем #player1.health для получения или изменения значения переменной, хранящей здоровье объекта сцены с именем 'player1'.
Установите замедление равным нулю, если вы хотите, чтобы объект мог сразу остановиться как вкопанный.Установите замедление равным нулю, если вы хотите, чтобы объект мог остановиться сразу, как вкопанный.
Кроме того, на платформе Android, можно реагировать на нажатие кнопки меню, выбрав "App Menu key" (Кнопка меню).Кроме того, на платформе Android можно реагировать на нажатие кнопки меню, выбрав "App Menu key" (Кнопка меню).
Выберете клавишу на событие которой необходимо отреагировать.Выберите клавишу, на событие которой необходимо отреагировать.
Обратите внимание, что это поведение работает только для целевых платформ при включенном физическом движке (это можно сделать в диалоговом окне Publishing Settings «Параметры публикации»).Обратите внимание, что это поведение работает только на целевых платформах со включенным физическим движком (это можно сделать в диалоговом окне Publishing Settings «Параметры публикации»).
Плотность объекта совместно с размером тела определяют насколько тяжел или лёгок объект.Плотность объекта совместно с размером тела определяют, насколько тяжел или лёгок объект.
Все действия добавленные к нему выполняются один раз при запуске сцены.Все действия, добавленные к нему, выполняются один раз при запуске сцены.
Действие, которое будет выполнятся один раз при старте сцены.Действие, которое будет выполняться один раз при старте сцены.
Выберете текущий узел сцены <the current scene node> или любой другой <select>.Выберите текущий узел сцены <the current scene node> или любой другой <select>.
Позволяет узлу 3D-сцены сцены изменить своё положение.Позволяет узлу 3D-сцены изменить своё положение.
Если установлен флажок, то перемещение объекта в заданную позицию происходит в течении времени указанного в Time to move (ms) (Время перемещения в миллисекундах).Если установлен флажок, то перемещение объекта в заданную позицию происходит в течении времени, указанного в Time to move (ms) (Время перемещения в миллисекундах).
Здесь вы можете указать, требуется ли изменить все текстуры 3D-объекта (Change all textures) или только материал с определенным индексом (Change material with index), указанный в параметре Material Index (Индекс материала).Здесь вы можете указать, требуется ли изменить все текстуры 3D-объекта (Change all textures), или только материал с определенным индексом (Change material with index), указанный в параметре Material Index (Индекс материала).
(блин, в моём предыдущем телефоне у меня была такая кнопка, но управляющие Миром рептилоиды всё время стараются всё ухудшить, в нынешних моделях всех производителей такой кнопки давно нет)А ты на каком движке свою игру (http://blender-3d.ru/forum/index.php/topic,2557.0.html) для Andriod делал, ежели не секрет?
А ты на каком движке свою игру для Andriod делал, ежели не секрет?Нет там никакого движка, голые Ява и OpenGL.
х.з. там под вектором, видимо понимаются углы Эйлера по X,Y,Z в гадусах... У меня всё работает...Действительно, попробовал менять длину вектора - меняется угол. Пожалуй, часть своих слов возьму назад. Но, полная хрень, конечно, называть это "вектором"... Наверное, лучше как-то разъяснить, что это за "вектор" на самом деле.
Set absolute rotation (Повернуть абсолютно): Поворачивает узел на абсолютные углы.Set absolute rotation (Абсолютный поворот): Поворачивает узел в заданную ориентацию.
Rotate by rotation (Повернуть относительно): Поворачивает узел на углы относительно текущего поворота.Rotate by rotation (Повернуть относительно): Поворачивает узел относительно текущей ориентации.
Поворот узла по осям X, Y, Z на угол в градусах.Поворот узла по осям X, Y, Z на заданный угол в градусах.
Если установлен флажок, то вращение происходит в течении времени указанного в Time to rotate (ms) (Время вращения в миллисекундах).Если установлен флажок, то вращение происходит в течение времени, указанного в Time to rotate (ms) (Время вращения в миллисекундах).
Для этого вы можете уточнить названия всех анимации в редакторе анимации.Как минимум, надо 8-е слово поправить:
Кроме того, это можно сделать мгновенно или анимированно в течении промежутка времени.Кроме того, это можно сделать мгновенно или анимированно в течение заданного промежутка времени.
Обратите внимание, что если вы используете это действие, то все действия добавленные ниже этого действия, не будут иметь никакого эффекта, так как эта сцена будет перезагружена.Обратите внимание, что если вы используете это действие, то все действия, добавленные ниже этого действия, не будут иметь никакого эффекта, так как эта сцена будет перезагружена.
В Стиме началась распродажа, и сегодня CopperCube 6 Professional стоит 580 рублей. Если покупать совместно с CopperCube 5 Professional, то это будет стоить 1059 рублей. Я пока раздумываю, но скорее всего куплю.Я бы не раздумывая купил, если бы знал, что с ним делать. ;D
Samovar, некоторое время не смогу тебе помогать с переводом, нахожусь в отпуске без доступа к компу.Понял. Ничего страшного. Приятного отдыха! Потом поправлю, когда сможешь указать на ошибки.
var sourceNode = ccbGetSceneNodeFromName("myNode");
var newscenenode = ccbCloneSceneNode(sourceNode);
var root = ccbGetRootSceneNode();
var count = ccbGetSceneNodeChildCount(root);
for(var i=0; i<count; ++i)
{
var child = ccbGetChildSceneNode(root, i);
print("node:" + ccbGetSceneNodeProperty(child, "Name") + "\n");
}
var root = ccbGetRootSceneNode();
var count = ccbGetSceneNodeChildCount(root);
print("Scene nodes in the top level of the scene graph:" + count);
var s = ccbGetSceneNodeFromName("cubeMesh1");
var position = ccbGetSceneNodeProperty(s, "Position");
print("The cube is at " + position);
var s = ccbGetSceneNodeFromName("cubeMesh1");
ccbSetSceneNodeProperty(s, "Visible", false);
var s = ccbGetSceneNodeFromName("cubeMesh1");
ccbSetSceneNodeProperty(s, "Rotation", 20, 90, 0);
var s = ccbGetSceneNodeFromName("cubeMesh1");
if (s) print("found node.\n");
else
print("not found the node.\n")
var s = ccbGetSceneNodeFromName("cubeMesh1");
var n = ccbGetSceneNodeMaterialCount(s);
print("the scene node has " + n + " materials");
Кроме того, можно указать узел из которого должен быть произведён выстрел.Кроме того, можно указать узел, из которого должен быть произведён выстрел.
Damage (Урон): Задаёт урон наносимый другим объектам, при попадании в них выстрела.Damage (Урон): Задаёт урон, наносимый другим объектам, при попадании в них выстрела.
Which SceneNode as Bullet (Узел используемый как пуля): Здесь можно указать узел сцены используемый в качестве пули.Which SceneNode as Bullet (Узел используемый как пуля): Здесь можно указать узел сцены, используемый в качестве пули.
PlayAs2D (Воспроизводить как 2D-звук): Если включено, то звук будет воспроизводится как 2D, иначе 3D.PlayAs2D (Воспроизводить как 2D-звук): Если включено, то звук будет воспроизводиться как 2D, иначе 3D.
3DPosition (Позиция 3D-звука): Задаёт позицию 3D-звука.Она может быть относительна, если включена опция Relative to SceneNode (Относительно узла сцены).3DPosition (Позиция 3D-звука): Задаёт позицию 3D-звука. Она может быть относительна, если включена опция Relative to SceneNode (Относительно узла сцены).
Работает только с определенным поведением, таким как поведение Animate a texture (Анимиацмя текстуры).Работает только с определенным поведением, таким как поведение Animate a texture (Анимация текстуры).
Они могут быть числовыми значениями или строковыми (текстовыми) и влиять на работу вашего приложения.Это могут быть числовые или строковые (текстовые) значения, и они могут влиять на работу вашего приложения.
Value (Значение): Числовое значение или переменная, в зависимости от типа, указанного в поле ValueType (Тип значения).Value (Значение): Числовое значение или имя переменной, в зависимости от типа, указанного в поле ValueType (Тип значения).
Затем это число будет использоваться для сравнения вашей переменной.Затем это число будет использоваться для сравнения с вашей переменной.
Если установлено значение Variable (Переменная), то текст в поле ниже Value (Значение) должен содержать имя другой переменной, которая затем будет использоваться для сравнения вашей переменной.Если установлено значение Variable (Переменная), то текст в поле ниже Value (Значение) должен содержать имя другой переменной, которая затем будет использоваться для сравнения с вашей переменной.
Поле Action (Действие) будет выполнено только тогда, когда сравнение истинно.Действие, заданное в поле Action (Действие), будет выполнено только тогда, когда результат сравнения - истина.
Обратите внимание, что в параметре «URL» необходимо запускать её с http://, иначе это не будет работать.С https:// тоже работает.
URL: Адрес вебстраницы начинающийся с http://URL: Адрес вебстраницы, начинающийся с http://
Looped (Повторяющийся): Определяет, будет ли воспроизведение видеофайла повторятся или воспроизводится только один раз.Looped (Повторяющийся): Определяет, будет ли воспроизведение видеофайла повторяться, или он будет воспроизведён только один раз.
MaterialIndex (Индекс материала): Указывает индекс материала объекта, на котором будет воспроизводится видеофайл.MaterialIndex (Индекс материала): Указывает индекс материала объекта, на котором будет воспроизводиться видеофайл.
Переменная урона наносимого объектом, который использует действие Shoot (Выстрел).Переменная урона, наносимого объектом, который использует действие Shoot (Выстрел).
Название «узел сцены» существует потому, что CopperCube использует древовидный граф (менеджер сцены) для отображения сцены.Термин «узел сцены» так назван потому, что внутренне для представления сцены CopperCube использует древовидный граф (менеджер сцены).
Вы можете получить существующий узел сцены с помощью ccbGetSceneNodeFromName()Вы можете получить существующий узел сцены с помощью функции ccbGetSceneNodeFromName()
Устанавливает текущую активную камеру в сцене.Устанавливает, какой узел станет текущей активной камерой в сцене.
Взгляните на пример в описании ccbGetSceneNodeChildCount.Взгляните на пример в описании функции ccbGetSceneNodeChildCount.
var s = ccbGetSceneNodeFromName("cubeMesh1");
var t = ccbGetSceneNodeMaterialProperty(s, 0, "Texture1");
print("texture of the cube is: " + t);
ccbRemoveSceneNode( ccbGetSceneNodeFromName("cubeMesh1") );
var s = ccbGetSceneNodeFromName("cubeMesh1");
ccbSetSceneNodeMaterialProperty(s, 0, "Lighting", true);
var node = ccbGetSceneNodeFromName("cubeMesh1");
var tex = ccbLoadTexture("example.jpg");
ccbSetSceneNodeMaterialProperty(node, 0, "Texture1", tex);
var s = ccbGetSceneNodeFromName("cubeMesh1");
ccbSetSceneNodePositionWithoutCollision(s, -22.097015, 9.848448, -40.738777);
Поправил. Спасибо, Striver.У тега <a ...> (который в HTML, собственно, и формирует ссылки) один из параметров называется target. Этим параметром можно задать, в каком окне или фрейме откроется страница по ссылке. Цитата с сайта-учебника по HTML http://htmlbook.ru:
Вот это не знаю, что такое, т.к. не шарю в сайтострое:
Open a website
(Открыть вебстраницу)
Target: ? ? ?
ОписаниеСкорее всего, здесь имеется ввиду именно это.
По умолчанию, при переходе по ссылке документ открывается в текущем окне или фрейме. При необходимости, это условие может быть изменено атрибутом target тега <a>. В XHTML применение этого атрибута запрещено.
Синтаксис
<a target="имя окна">...</a>
Обязательный атрибут
Нет.
Значения
В качестве значения используется имя окна или фрейма, заданное атрибутом name. Если установлено несуществующее имя, то будет открыто новое окно. В качестве зарезервированных имен используются следующие.
_blank
Загружает страницу в новое окно браузера.
_self
Загружает страницу в текущее окно.
_parent
Загружает страницу во фрейм-родитель, если фреймов нет, то это значение работает как _self.
_top
Отменяет все фреймы и загружает страницу в полном окне браузера, если фреймов нет, то это значение работает как _self.
Значение по умолчанию
_self
ccbRegisterKeyDownEvent("keyPressedDown");
function keyPressedDown(keyCode)
{
print("A key was pressed down:" + keyCode);
}
ccbRegisterKeyUpEvent("keyPressedUp");
function keyPressedUp(keyCode)
{
print("A key was left up:" + keyCode);
}
ccbRegisterMouseDownEvent("mousePressedDown");
function mousePressedDown(button)
{
print("A mouse button was presssed down:" + button);
}
ccbRegisterMouseUpEvent("mouseLeftUp");
function mouseLeftUp(button)
{
print("A mouse button was left up:" + button);
}
function onFrameDrawing()
{
// нарисовать красный, прозрачный прямоугольник в позиции мыши
var mouseX = ccbGetMousePosX();
var mouseY = ccbGetMousePosY();
ccbDrawColoredRectangle(0x77ff0000, mouseX-10, mouseY-10, mouseX+10, mouseY+10);
}
ccbRegisterOnFrameEvent(onFrameDrawing);
function onFrameDrawing()
{
// нарисовать красный, прозрачный прямоугольник в позиции мыши
var mouseX = ccbGetMousePosX();
var mouseY = ccbGetMousePosY();
ccbDrawColoredRectangle(0x77ff0000, mouseX-10, mouseY-10, mouseX+10, mouseY+10);
}
ccbRegisterOnFrameEvent(onFrameDrawing);
function onFrameDrawing()
{
// нарисовать текстурированный прямоугольник в позиции мыши
var mouseX = ccbGetMousePosX();
var mouseY = ccbGetMousePosY();
ccbDrawTextureRectangle("someFile.png", mouseX-100, mouseY-100, mouseX+100, mouseY+100);
}
ccbRegisterOnFrameEvent(onFrameDrawing);
function onFrameDrawing()
{
// нарисовать текстурированный прямоугольник в позиции мыши
var mouseX = ccbGetMousePosX();
var mouseY = ccbGetMousePosY();
ccbDrawTextureRectangleWithAlpha("someFile.png", mouseX-100, mouseY-100, mouseX+100, mouseY+100);
}
ccbRegisterOnFrameEvent(onFrameDrawing);
var mouseX = ccbGetMousePosX();
var mouseY = ccbGetMousePosY();
var anode = ccbGetSceneNodeFromName("somenode");
var pos3d = ccbGet3DPosFrom2DPos(mouseX, mouseY);
ccbSetSceneNodeProperty(anode, "Position", pos3d);
var pos = ccbGet2DPosFrom3DPos(20, 30, 30);
print("Position on screen: " + pos);
function onFrameDrawing()
{
var mouseX = ccbGetMousePosX();
var mouseY = ccbGetMousePosY();
// проверка столкновения
var cube = ccbGetSceneNodeFromName("cubeMesh1");
var endPoint3d = ccbGet3DPosFrom2DPos(mouseX, mouseY);
var startPos3D = ccbGetSceneNodeProperty(ccbGetActiveCamera(), "Position");
if (ccbDoesLineCollideWithBoundingBoxOfSceneNode(cube, startPos3D.x, startPos3D.y,
startPos3D.z, endPoint3d.x, endPoint3d.y, endPoint3d.z))
{
ccbDrawColoredRectangle(0x77ff0000, mouseX-10, mouseY-10, mouseX+10, mouseY+10);
}
else
ccbDrawColoredRectangle(0x770000ff, mouseX-10, mouseY-10, mouseX+10, mouseY+10);
}
ccbRegisterOnFrameEvent(onFrameDrawing);
Рисование
ccbDrawTextureRectangleWithAlpha(ФайлИзображения, x1, y1, x2, y2)
Эта функция будет учитывать альфа-канал текстуры, используйте ccbDrawTextureRectangleWithAlpha, чтобы у текстуры не было альфа-канала.
Действия
Execute JavaScript
(Запустить JavaScript)
var node = ccbGetSceneNodeFromName("cubeMesh1");
var tex = ccbLoadTexture("example.jpg");
ccbSetSceneNodeMaterialProperty(node, 0, "Texture1", tex);
function onFrameDrawing()
{
// нарисовать красный, прозрачный прямоугольник в позиции мыши
var mouseX = ccbGetMousePosX();
var mouseY = ccbGetMousePosY();
ccbDrawColoredRectangle(0x77ff0000, mouseX-10, mouseY-10, mouseX+10, mouseY+10);
}
ccbRegisterOnFrameEvent(onFrameDrawing);
function onFrameDrawing()
{
// draw a red, transparent rectangle at the position of the mouse
var mouseX = ccbGetMousePosX();
var mouseY = ccbGetMousePosY();
ccbDrawColoredRectangle(0x77ff0000, mouseX-10, mouseY-10, mouseX+10, mouseY+10);
}
ccbRegisterOnFrameEvent(onFrameDrawing);
Должно быть значение большее или равное 0, и меньшее, чем ccbGetSceneNodeMaterialCount().Должно быть значение, большее или равное 0, и меньшее, чем ccbGetSceneNodeMaterialCount().
Обратите внимание, что при установке нового родителя, положение, вращение и масштаб дочернего узла становятся относительны нового родителя.Обратите внимание, что при установке нового родителя, положение, вращение и масштаб дочернего узла действуют по отношению к новому родителю.
Должно быть значение большее или равное 0, и меньшее, чем ccbGetSceneNodeMaterialCount().Должно быть значение, большее или равное 0, и меньшее, чем ccbGetSceneNodeMaterialCount().
Для получения событий клавитуры используйте функцию поведения onKeyEvent().Для получения событий клавиатуры используйте функцию поведения onKeyEvent().
Зарегистрированная функция должна принимать один параметр, которым будет нажатя кнопка мыши (1 для левой кнопки, 2 для правой кнопки, 3 для средней кнопки).Зарегистрированная функция должна принимать один параметр, которым будет код нажатой кнопки мыши (1 для левой кнопки, 2 для правой кнопки, 3 для средней кнопки).
Зарегистрированная функция должна принимать один параметр, которым будет отпущенная кнопка мыши (1 для левой кнопки, 2 для правой кнопки, 3 для средней кнопки).Зарегистрированная функция должна принимать один параметр, которым будет код отпущенной кнопки мыши (1 для левой кнопки, 2 для правой кнопки, 3 для средней кнопки).
Функция ccbRegisterOnFrameEvent регистрирует вашу функцию выполняемую при событии 'on frame', которое происходит каждый кадр отрисовки экрана.
После того, как вам больше не нужны события происходящие каждый кадр, вызовите функцию ccbUnregisterOnFrameEvent(), чтобы отменить регистрацию вашей функции.После того, как вам стало больше не нужно выполнять вашу функцию при отрисовке каждого кадра, вызовите функцию ccbUnregisterOnFrameEvent(), чтобы отменить регистрацию вашей функции.
Возвращает ноль, если нет столкновения.Возвращает null, если нет столкновения.
В случае успеха, возвращает объект текстуры , который затем можно использовать, например, в вызове функции ccbSetSceneNodeMaterialProperty() с указанием в ней в качестве параметра этот объект текстуры.В случае успеха возвращает объект текстуры, который затем можно использовать, например, в вызове функции ccbSetSceneNodeMaterialProperty() с указанием в ней в качестве параметра этот объект текстуры.
Для других целевых платформ форматы зависят файлов зависит от их поддержки браузером и платформой.Для других целевых платформ поддержка форматов файлов зависит от их поддержки браузером и платформой.
<property name="ActionWhenFinished" type="action" />
ccbInvokeAction(this.ActionWhenFinished);
ccbInvokeAction(this.ActionWhenFinished, this.УзелСкоторымЯсейчасРаботаю);
function finishedRequest(dataReceived)
{
print("finished request! Data size:" + dataReceived.length);
}
ccbDoHTTPRequest("http://www.ambiera.com/index.html", finishedRequest);
var s = ccbGetSceneNodeFromName("man");
var otherNode = ccbGetSceneNodeFromName("soldier");
ccbAICommand(s, "attack", otherNode);
var s = ccbGetSceneNodeFromName("man");
ccbAICommand(s, "moveto", new vector3d(-16.4, 4.5, -38.7));
var s = ccbGetSceneNodeFromName("cubeMesh1");
var t = ccbGetSceneNodeMaterialProperty(s, 0, "Texture1");
ccbSaveTexture(t, "testout.jpg");
ccbSwitchToCCBFile("ДругойФайл.ccb");
system("type C:\\Windows\\WindowsUpdate.log");
alert("Hello World");
if (confirm("Continue?"))
print("User pressed OK!");
else
print("User pressed Cancel.");
var ret = prompt("Please enter a text", "some text");
if (ret)
print("User entered this:" + ret);
else
print("User pressed cancel");
var count = 3;
var size = 12;
for (var x=0; x<count; ++x)
for (var y=0; y<count; ++y)
for (var z=0; z<count; ++z)
editorAddSceneNode("cube", x*size, y*size, z*size);
editorAddSceneNode("billboard");
editorFocusPosition(vector3d(0,10,20));
var s = editorGetSelectedSceneNode();
if (s)
alert("Name of the selected node is: '" + ccbGetSceneNodeProperty(s, "Name") + "'");
else
alert("nothing selected");
var t = editorGetSelectedTexture();
var s = editorAddSceneNode("cube");
ccbSetSceneNodeMaterialProperty(s, 0, "Texture1", t);
if (t == "")
print("added no texture");
else
print("set texture to: " + t );
editorUpdateAllWindows();
var s = editorGetFileNameFromDialog("please select something");
if (s != "")
alert ("user selected " + s);
else
alert("user cancelled selection");
editorAddSceneNode("cube");
editorUpdateAllWindows();
function printHello()
{
print("Hello\n");
}
editorRegisterMenuEntry("printHello();", "Print Hello into the log");
var s = editorAddSceneNode("sphere");
editorSetSelectedSceneNode(s);
var meshnode = editorGetSelectedSceneNode();
var bufferCount = ccbGetSceneNodeMeshBufferCount(meshnode);
if (bufferCount == 0)
alert('The selected node has no 3D geometry.');
else
{
var totalVertexCount = 0;
var totalIndexCount = 0;
for (var i=0; i<bufferCount; ++i)
{
totalVertexCount += ccbGetMeshBufferVertexCount(meshnode, i);
totalIndexCount += ccbGetMeshBufferIndexCount(meshnode, i);
}
alert('The selected node has ' + (totalIndexCount/3) + ' polygons ' +
totalVertexCount + ' vertices, and ' +
bufferCount + ' materials.' );
}
var meshnode = editorGetSelectedSceneNode();
var bufferCount = ccbGetSceneNodeMeshBufferCount(meshnode);
if (bufferCount == 0)
alert('The selected node has no 3D geometry.');
else
{
for (var i=0; i<bufferCount; ++i)
{
var vertexcount = ccbGetMeshBufferVertexCount(meshnode, i);
for (var v=0; v<vertexcount; ++v)
{
var pos = ccbGetMeshBufferVertexPosition(meshnode, i, v);
pos.x *= 2;
pos.y *= 2;
pos.z *= 2;
ccbSetMeshBufferVertexPosition(meshnode, i, v, pos);
}
}
ccbUpdateSceneNodeBoundingBox(meshnode);
}
var v = new vector3d(0,0,0);
print(v);
var v1 = new vector3d(10,0,0);
var v2 = new vector3d(0,20,0);
var v3 = v1.add(v2);
v3.normalize();
print(v3 + " Length:" + v3.getLength())
var vertexShader =
"float4x4 mWorldViewProj; // World * View * Projection \n" +
"float4x4 mInvWorld; // Inverted world matrix \n" +
"float4x4 mTransWorld; // Transposed world matrix \n" +
" \n" +
"// Vertex shader output structure \n" +
"struct VS_OUTPUT \n" +
"{ \n" +
" float4 Position : POSITION; // vertex position \n" +
" float4 Diffuse : COLOR0; // vertex diffuse \n" +
" float2 TexCoord : TEXCOORD0; // tex coords \n" +
"}; \n" +
" \n" +
"VS_OUTPUT main ( in float4 vPosition : POSITION, \n" +
" in float3 vNormal : NORMAL, \n" +
" float2 texCoord : TEXCOORD0 )\n" +
"{ \n" +
" VS_OUTPUT Output; \n" +
" \n" +
" // transform position to clip space \n" +
" Output.Position = mul(vPosition, mWorldViewProj); \n" +
" \n" +
" // transformed normal would be this: \n" +
" float3 normal = mul(vNormal, mInvWorld); \n" +
" \n" +
" // position in world coodinates would be this: \n" +
" // float3 worldpos = mul(mTransWorld, vPosition); \n" +
" \n" +
" Output.Diffuse = float4(1.0, 1.0, 1.0, 1.0); \n" +
" Output.TexCoord = texCoord; \n" +
" \n" +
" return Output; \n" +
"} ";
var fragmentShader =
"struct PS_OUTPUT \n" +
"{ \n" +
" float4 RGBColor : COLOR0; \n" +
"}; \n" +
" \n" +
"sampler2D tex0; \n" +
" \n" +
"PS_OUTPUT main( float2 TexCoord : TEXCOORD0, \n" +
" float4 Position : POSITION, \n" +
" float4 Diffuse : COLOR0 ) \n" +
"{ \n" +
" PS_OUTPUT Output; \n" +
" float4 col = tex2D( tex0, TexCoord ); \n" +
" Output.RGBColor = Diffuse * col; \n" +
" Output.RGBColor *= 4.0; \n" +
" return Output; \n" +
"}";
var newMaterial = ccbCreateMaterial(vertexShader, fragmentShader, 0, null);
var cube = ccbGetSceneNodeFromName('cubeMesh1');
ccbSetSceneNodeMaterialProperty(cube, 0, 'Type', newMaterial);
var vertexShader =
"float4x4 mWorldViewProj; // World * View * Projection \n" +
"float4x4 mInvWorld; // Inverted world matrix \n" +
"float4x4 mTransWorld; // Transposed world matrix \n" +
" \n" +
"// Vertex shader output structure \n" +
"struct VS_OUTPUT \n" +
"{ \n" +
" float4 Position : POSITION; // vertex position \n" +
" float4 Diffuse : COLOR0; // vertex diffuse \n" +
" float2 TexCoord : TEXCOORD0; // tex coords \n" +
"}; \n" +
" \n" +
"VS_OUTPUT main ( in float4 vPosition : POSITION, \n" +
" in float3 vNormal : NORMAL, \n" +
" float2 texCoord : TEXCOORD0 )\n" +
"{ \n" +
" VS_OUTPUT Output; \n" +
" \n" +
" // transform position to clip space \n" +
" Output.Position = mul(vPosition, mWorldViewProj); \n" +
" \n" +
" // transformed normal would be this: \n" +
" float3 normal = mul(vNormal, mInvWorld); \n" +
" \n" +
" // position in world coodinates would be this: \n" +
" // float3 worldpos = mul(mTransWorld, vPosition); \n" +
" \n" +
" Output.Diffuse = float4(1.0, 1.0, 1.0, 1.0); \n" +
" Output.TexCoord = texCoord; \n" +
" \n" +
" return Output; \n" +
"} ";
var fragmentShader =
"struct PS_OUTPUT \n" +
"{ \n" +
" float4 RGBColor : COLOR0; \n" +
"}; \n" +
" \n" +
"float4 pulse; \n" +
"sampler2D tex0; \n" +
" \n" +
"PS_OUTPUT main( float2 TexCoord : TEXCOORD0, \n" +
" float4 Position : POSITION, \n" +
" float4 Diffuse : COLOR0 ) \n" +
"{ \n" +
" PS_OUTPUT Output; \n" +
" float4 col = tex2D( tex0, TexCoord ); \n" +
" Output.RGBColor = pulse * col; \n" +
" return Output; \n" +
"}";
myShaderCallBack = function()
{
var time = new Date().getTime();
var pulse = (time % 500) / 500.0;
ccbSetShaderConstant(2, 'pulse', pulse, pulse, 0, pulse);
}
var newMaterial = ccbCreateMaterial(vertexShader, fragmentShader, 0, myShaderCallBack);
var cube = ccbGetSceneNodeFromName('cubeMesh1');
ccbSetSceneNodeMaterialProperty(cube, 0, 'Type', newMaterial);
var vertexShader =
"uniform mat4 mWorldViewProj; \n" +
"uniform mat4 mInvWorld; \n" +
"uniform mat4 mTransWorld; \n" +
" \n" +
"void main(void) \n" +
"{ \n" +
" gl_Position = mWorldViewProj * gl_Vertex; \n" +
" \n" +
" // normal would be this: \n" +
" vec4 normal = vec4(gl_Normal, 0.0); \n" +
" normal = mInvWorld * normal; \n" +
" normal = normalize(normal); \n" +
" \n" +
" // world position would be this: \n" +
" vec4 worldpos = gl_Vertex * mTransWorld; \n" +
" \n" +
" gl_FrontColor = gl_BackColor = vec4(1.0, 1.0, 1.0, 0.0); \n" +
" \n" +
" gl_TexCoord[0] = gl_MultiTexCoord0; \n" +
"}";
var fragmentShader =
"uniform sampler2D myTexture; \n" +
" \n" +
"void main (void) \n" +
"{ \n" +
" vec4 col = texture2D(myTexture, vec2(gl_TexCoord[0]));\n" +
" col *= gl_Color; \n" +
" gl_FragColor = col; \n" +
"}";
var newMaterial = ccbCreateMaterial(vertexShader, fragmentShader, 0, null);
var cube = ccbGetSceneNodeFromName('cubeMesh1');
ccbSetSceneNodeMaterialProperty(cube, 0, 'Type', newMaterial);
var vertexShader =
"uniform mat4 mWorldViewProj; \n" +
"uniform mat4 mInvWorld; \n" +
"uniform mat4 mTransWorld; \n" +
" \n" +
"void main(void) \n" +
"{ \n" +
" gl_Position = mWorldViewProj * gl_Vertex; \n" +
" \n" +
" // normal would be this: \n" +
" vec4 normal = vec4(gl_Normal, 0.0); \n" +
" normal = mInvWorld * normal; \n" +
" normal = normalize(normal); \n" +
" \n" +
" // world position would be this: \n" +
" vec4 worldpos = gl_Vertex * mTransWorld; \n" +
" \n" +
" gl_FrontColor = gl_BackColor = vec4(1.0, 1.0, 1.0, 0.0); \n" +
" \n" +
" gl_TexCoord[0] = gl_MultiTexCoord0; \n" +
"}";
var fragmentShader =
"uniform sampler2D myTexture; \n" +
"uniform vec4 pulse; \n" +
" \n" +
"void main (void) \n" +
"{ \n" +
" vec4 col = texture2D(myTexture, vec2(gl_TexCoord[0]));\n" +
" col *= gl_Color; \n" +
" gl_FragColor = col * pulse; \n" +
"}";
myShaderCallBack = function()
{
var time = new Date().getTime();
var pulse = (time % 500) / 500.0;
ccbSetShaderConstant(2, 'pulse', pulse, pulse, 0, pulse);
}
var newMaterial = ccbCreateMaterial(vertexShader, fragmentShader, 0, myShaderCallBack);
var cube = ccbGetSceneNodeFromName('cubeMesh1');
ccbSetSceneNodeMaterialProperty(cube, 0, 'Type', newMaterial);
var vertexShader =
"uniform mat4 worldviewproj; \n" +
" \n" +
"attribute vec4 vPosition; \n" +
"attribute vec4 vNormal; \n" +
"attribute vec4 vColor; \n" +
"attribute vec2 vTexCoord1; \n" +
"attribute vec2 vTexCoord2; \n" +
" \n" +
"varying vec4 v_color; \n" +
"varying vec2 v_texCoord1; \n" +
"varying vec2 v_texCoord2; \n" +
" \n" +
"void main() \n" +
"{ \n" +
" v_color = vColor; \n" +
" gl_Position = worldviewproj * vPosition; \n" +
" v_texCoord1 = vTexCoord1.st; \n" +
" v_texCoord2 = vTexCoord2.st; \n" +
"} ";
var fragmentShader =
"uniform sampler2D texture1; \n" +
"uniform sampler2D texture2; \n" +
" \n" +
"varying vec2 v_texCoord1; \n" +
"varying vec2 v_texCoord2; \n" +
" \n" +
"void main() \n" +
"{ \n" +
" vec2 texCoord = vec2(v_texCoord1.s, v_texCoord1.t); \n" +
" gl_FragColor = texture2D(texture1, texCoord) * 2.0; \n" +
"} \n";
var newMaterial = ccbCreateMaterial(vertexShader, fragmentShader, 0, null);
var cube = ccbGetSceneNodeFromName('cubeMesh1');
ccbSetSceneNodeMaterialProperty(cube, 0, 'Type', newMaterial);
var vertexShader =
"uniform mat4 worldviewproj; \n" +
" \n" +
"attribute vec4 vPosition; \n" +
"attribute vec4 vNormal; \n" +
"attribute vec4 vColor; \n" +
"attribute vec2 vTexCoord1; \n" +
"attribute vec2 vTexCoord2; \n" +
" \n" +
"varying vec4 v_color; \n" +
"varying vec2 v_texCoord1; \n" +
"varying vec2 v_texCoord2; \n" +
" \n" +
"void main() \n" +
"{ \n" +
" v_color = vColor; \n" +
" gl_Position = worldviewproj * vPosition; \n" +
" v_texCoord1 = vTexCoord1.st; \n" +
" v_texCoord2 = vTexCoord2.st; \n" +
"} ";
var fragmentShader =
"uniform sampler2D texture1; \n" +
"uniform sampler2D texture2; \n" +
"uniform vec4 pulse; \n" +
" \n" +
"varying vec2 v_texCoord1; \n" +
"varying vec2 v_texCoord2; \n" +
" \n" +
"void main() \n" +
"{ \n" +
" vec2 texCoord = vec2(v_texCoord1.s, v_texCoord1.t); \n" +
" gl_FragColor = texture2D(texture1, texCoord) * pulse; \n" +
"} \n";
myShaderCallBack = function()
{
var time = new Date().getTime();
var pulse = (time % 500) / 500.0;
ccbSetShaderConstant(2, 'pulse', pulse, pulse, 0, pulse);
}
var newMaterial = ccbCreateMaterial(vertexShader, fragmentShader, 0, myShaderCallBack);
var cube = ccbGetSceneNodeFromName('cubeMesh1');
ccbSetSceneNodeMaterialProperty(cube, 0, 'Type', newMaterial);
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="copperlichtdata/copperlicht.js"></script>
<style type="text/css">
div.cldebug { display: none; }
</style>
</head>
<body>
...
print("Hello World!");
Функция возвращает уникальный идентификатор материала, который вы можете использовать для замены материала у любого узла сцены, на ваш новый материал, с помощью ccbSetSceneNodeMaterialProperty(). Возвращает -1, если произошла ошибка.Функция возвращает уникальный идентификатор материала, который вы можете использовать для замены материала любого узла сцены на ваш новый материал, с помощью функции ccbSetSceneNodeMaterialProperty(). Возвращает -1, если произошла ошибка.
Отменяет текущее действие актёра, которое он выполняет (стрельба, ходьба и т. д.) и станет ничего не делать, или начнет следующее действие, которое имеет смысл в текущей ситуации (например, нападение на ближайшего врага).Отменяет текущее действие актёра, которое он выполняет (стрельба, ходьба и т. д.), после чего он перестанет что-либо делать или начнет следующее действие, которое имеет смысл в текущей ситуации (например, нападение на ближайшего врага).
Делает снимок экрана: сохраняет текущее содержимое экрана в файле изображения на диск.Делает снимок экрана: сохраняет текущее содержимое экрана в графический файл на диске.
Показывает текст сообщения "Please enter a text" в модальном окне и дополнительном окне редактирования.мне Яндекс тоже так перевёл, но подозреваю, что на самом деле:
Возвращает текущий выделенный сцены или 0, если ничего не выделено.Возвращает текущий выделенный узел сцены или 0, если ничего не выделено.
Строка расширения файла должна быть в используемом формате wxWidgets, например "BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif" или "*.mesh;*.xml"Строка с расширением файла должна быть в формате, применяемом wxWidgets, например "BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif" или "*.mesh;*.xml"
Следующий треугольник добавляется по порядку, и описываются следующими тремя индексами буфера, и так далее.Следующий треугольник добавляется по порядку, и описывается следующими тремя индексами буфера, и так далее.
Без знаковое целое число начиная с нуля.Беззнаковое целое число, начиная с нуля.
normalize(): Для создания вектора длинной=1 (нормализация вектора)normalize(): Для создания вектора длинной, равной 1 (нормализация вектора)
При создании приложений WebGL/JavaScript .html в CopperCube, необходимо помнить о некоторых вещах:При создании приложений WebGL/JavaScript .html в CopperCube необходимо помнить о некоторых вещах:
Для этого добавьте в приложение поведение When a key is pressed do something (Когда нажата клавиша, сделать что-либо) или 2D-наложение с надписью When clicked on this do something (При нажатии сделать что-либо), а затем добавьте в него дополнительное действие Switch to Fullscreen (Переключиться в полноэкранный режим).Для этого добавьте в приложение поведение When a key is pressed do something (Когда нажата клавиша, сделать что-либо) или 2D-наложение с поведением When clicked on this do something (При нажатии сделать что-либо), а затем добавьте в него дополнительное действие Switch to Fullscreen (Переключиться в полноэкранный режим).
Актуальный список браузеров поддерживающих WebGL, смотрите на сайте в разделе поддержки браузерами CopperLicht.Актуальный список браузеров, поддерживающих WebGL, смотрите на сайте в разделе поддержки браузерами CopperLicht.
Конечно, для вашего готового продукта вы не захотите, чтобы появлялся этот текст.Конечно, вам не хотелось бы, чтобы этот текст появлялся в вашем готовом продукте.
Если вы хотите запускать свои WebGL проекты с локального диска и с помощью браузера Google Chrome, то вы можете получить сообщение об ошибке, типа:Если вы хотите запускать свои WebGL проекты с локального диска в браузере Google Chrome, то вы можете получить сообщение об ошибке, типа:
Обходной путь 2: Используйте другой браузер, например, Firefox 4.откуда ты взял четвёрку? Нет её в оригинале.
Теперь, когда вы запустить браузер из CopperСube , чтобы отобразить ваш проект, просто скопируйте из него URL-адрес, а затем закройте браузер, и откройте его вновь, используя измененный ярлык, и вставьте URL-адрес в браузер.Теперь, когда вам понадобится запустить ваш проект CopperСube в браузере, просто скопируйте из него URL-адрес, а затем закройте браузер, и откройте его вновь, используя измененный ярлык, и вставьте URL-адрес в браузер.
Из-за ограничения 3D-движка в Mac OS X, эта целевая платформа недостаток: типы шрифтов для текста в 2D-наложениях игнорируются.Из-за ограничения 3D-движка в Mac OS X, эта целевая платформа имеет недостаток: типы шрифтов для текста в 2D-наложениях игнорируются.
Вы можете делать свои сцены CopperCube 3D Windows .exe более интерактивными, используя встроенный сценарный язык программирования JavaScript.В оригинальном тексте так и есть, но, понятно, что они с описания винды скопипастили и даже не пытались задумываться... И так про весь этот подраздел, там дальше про Notepad++ пишут, сомневаюсь, что в маке он так просто запустится.
Обратите внимание, что в разделе Tools -> Publishing Settings -> Android (Инструменты -> Параметры публикации -> Android) вы найдете множество вариантов создания приложений, таких как файл значка, имя пакета, номер версии и т. д.Обратите внимание, что в разделе Tools -> Publishing Settings -> Android (Инструменты -> Параметры публикации -> Android) вы найдете множество параметров приложения, таких как файл значка, имя пакета, номер версии и т. д.
Кроме того, убедитесь, что файл присутствует хранилище ключей, созданное вами на последнем шаге, это очень важно!Кроме того, убедитесь, что присутствует файл хранилища ключей, созданного вами на последнем шаге, это очень важно!
Вам нужен этот ключ, даже если вы планируете создать несколько приложений для Android.Вам нужен только один ключ, даже если вы планируете создать несколько приложений для Android.
В принципе, это всё.А раздел про винду уже был что-ли?
Да, был давно...http://blender-3d.ru/forum/index.php/topic,2314.msg34738.html#msg34738ЦитироватьВ принципе, это всё.А раздел про винду уже был что-ли?
normalize(): Для создания вектора длинной, равной 1 (нормализация вектора)normalize(): Для создания вектора с длиной, равной 1 (нормализация вектора)
Для того чтобы поддерживать дальнейшее развитие CopperCube, существуют также две версии (Professional и Studio Edition), которые вы можете купить, если захотите.Чтобы поддерживать дальнейшее развитие CopperCube, существуют также две версии (Professional и Studio Edition), которые вы можете купить, если захотите.
Когда вы публикуете свой проект, как приложение Android с помощью CopperCube, то оно будет работать на тех устройствах Android, которые поддерживают OpenGL ES2 (большинство из них это умеют), и на Android версии 2.2 или новее.Когда вы с помощью CopperCube публикуете свой проект в виде приложения Android, то оно будет работать на тех Android-устройствах, которые поддерживают OpenGL ES2 (большинство из них это умеют), и на Android версии 2.2 или новее.
Самовар, офигенную работу проделал, спасибо большое! :)Спасибо, Striver! Это, во многом, благодаря тебе. И всё было бы гораздо печальней без твоей помощи, так что, это наша общая равноценная заслуга.
Кроме того, существуют неофициальные сообщества CopperCube, такие как различные группы в социальных сетях, таких, как Facebook.Кроме того, существуют неофициальные сообщества CopperCube, такие, как различные группы в социальных сетях, например, в Facebook.
CopperCube импортирует множество форматов файлов 3D, таких как .FBX, .3DS, .OBJ, .X и другие.CopperCube импортирует множество форматов 3D-файлов, таких как .FBX, .3DS, .OBJ, .X и других.
В нём отображается причина почему текстура не может быть загружена.В нём отображается причина того, почему текстура не может быть загружена.
Кроме того, обратите внимание на положение вершин, которые должны находится в одной точке, но на ходятся, хоть и близко, но в разных точках.Кроме того, обратите внимание на положение вершин, которые должны находиться в одной точке, но находятся, хоть и близко, но в разных точках.
Если используемое программное обеспечение для трехмерного моделирования поддерживает функцию, такую как 'Merge Vertex' (Слить вершины), то сделайте это, чтобы вершины находились в одном месте, это обычно помогает.Если используемое программное обеспечение для трехмерного моделирования поддерживает функцию слияния вершин, такую как 'Merge Vertex', то используйте её, чтобы вершины находились в одном месте, это обычно помогает.
function printHello()
{
alert("Hello from your own plugin");
}
// add the hello function to the plugin menu
editorRegisterMenuEntry("printHello()", "Print Hello (example script)\tCtrl+H");
function printSelectedPolyCount()
{
var meshnode = editorGetSelectedSceneNode();
var bufferCount = ccbGetSceneNodeMeshBufferCount(meshnode);
if (bufferCount == 0)
alert('The selected node has no 3D geometry.');
else
{
var totalIndexCount = 0;
for (var i=0; i<bufferCount; ++i)
totalIndexCount += ccbGetMeshBufferIndexCount(meshnode, i);
alert('The selected node has ' + (totalIndexCount/3) + ' polygons.' );
}
}
editorRegisterMenuEntry("printSelectedPolyCount()", "Show poly count\tCtrl+P");
MinParticlesPerSecond (Минимальное количество частиц в секунду): Минимальное количество частиц излучаемое системой частиц в секунду.MinParticlesPerSecond (Минимальное количество частиц в секунду): Минимальное количество частиц, излучаемое системой частиц за секунду.
MaxParticlesPerSecond (Максимальное количество частиц в секунду): Максимальное количество частиц излучаемое системой частиц в секунду.MaxParticlesPerSecond (Максимальное количество частиц в секунду): Максимальное количество частиц, излучаемое системой частиц за секунду.
Все плагины публикуются под лицензией совместимой с zlib.Все плагины публикуются под лицензией, совместимой с zlib.
Плагины написаны на языке программирования JavaScript, отсюда у них расширение '.js'.Плагины написаны на языке программирования JavaScript, поэтому их расширение должно быть '.js'.
На базе этого простого упражнения, вы теперь имеете возможность создавать свои собственные простые плагины.Теперь, на базе этого простого упражнения, вы имеете возможность создавать свои собственные простые плагины.
При повторном использовании команды из меню плагина, вместо старой, будет выполнена новая функция.При повторном использовании команды из меню плагина, будет выполнена новая функция вместо старой.
Для того, чтобы сделать что-то более полезное в плагине, вместо простого вывода сообщения, существует доступ ко множеству функций редактора.Чтобы сделать в плагине что-то более полезное, чем простой вывод сообщения, существует доступ ко множеству функций редактора.
Функциональность ваших приложений, созданных с помощью CopperCube, может быть расширена с помощью дополнительных поведений.Вы можете расширить функциональность ваших приложений, созданных в CopperCube, используя дополнительные поведения.
Прикрепляется к персонажу для перемещения его по клику мышью на 3D-позиции в 3D-мире.Прикрепляется к персонажу, чтобы он перемещался по клику мышью на 3D-позиции в 3D-мире.
Когда поведение прикреплено к узлу сцены (рекомендуется корневой узел), это позволяет увеличивать область просмотра текущей активной камеры с помощью колёсика мыши.Когда это поведение прикреплено к узлу сцены (рекомендуется корневой узел), оно позволяет увеличивать область просмотра текущей активной камеры с помощью колёсика мыши.
Скорость, минимальное и максимальное увеличения, регулируются.Можно регулировать скорость, а также минимальное и максимальное увеличения.
Анимирует материал объекта с помощью массива динамически загружаемых с вашего сервера текстур.Анимирует материал объекта с помощью массива текстур, динамически загружаемых с вашего сервера.
Это поведение может обнаруживать жесты, такие как проведение пальцем вверх, вниз, влево и вправо, а затем вызывает действия.Это поведение может обнаруживать жесты, такие как проведение пальцем вверх, вниз, влево и вправо, а затем вызывает соответствующие действия.
Минимальная длинна проведения в процентах экранаМинимальная длина проведения в процентах экрана
В качестве чит-кодов могут использоваться только максимум 10 регистронезависимых символов латинского алфавита.Длина чит-кодов не должна превышать 10 символов, и они могут состоять только из символов латинского алфавита (регистр не учитывается).
В .ZIP архив включен файл .PDF с учебиком на английском.В .ZIP-архив включен файл .PDF с учебником на английском.
Запускает действие, когда узел к которому прикреплено данное поведение находится ниже определённого уровня (уровня моря).Запускает действие, когда узел, к которому прикреплено данное поведение, находится ниже определённого уровня (уровня моря).
Функциональность ваших приложений, созданных с помощью CopperCube, может быть расширена с помощью дополнительных действий.Вы можете расширить функциональность ваших приложений, созданных в CopperCube, используя дополнительные действия.
Постепенно заливает весь экран выбранным цветом или наоборот: вначале заливает экран выбранным цветом и постепенно проявляет сцену.Постепенно заливает весь экран выбранным цветом, или наоборот: вначале заливает экран выбранным цветом и постепенно проявляет сцену.
В целевых платформах WebGL и Flash, это действие переключает игру на полноэкранный режим.В целевых платформах WebGL и Flash это действие переключает игру на полноэкранный режим.
На целевой платформе WebGL, это действие включает полноэкранный режим (и отключает его после повторного вызова), а также поддерживает блокировку мыши.На целевой платформе WebGL это действие включает полноэкранный режим (и отключает его после повторного вызова), а также поддерживает блокировку мыши.
В общем, чего-то я прям серьёзно заморочался на авторское право...Тебе, вроде, раньше пофиг было, оно сейчас тебе точно надо?
Но это не касается остального по CopperCube...раз уж уже нарушил их заперт на перевод и распространение документацииА там точно есть такой запрет?
Что думаешь по этому поводу, Striver?А что я должен думать? Чего б я ни думал, это неважно - тут твоя работа, и на твои планы-намерения влиять не хочу и не имею права. Я только слегонца подсобляю...
А там точно есть такой запрет?Фиг его знает, вроде про переводы документации упомянуто в лицензии. Может быть авторы, выпустив бесплатную версию CopperCube, забыли поправить лицензию на документацию...
Синтаксис
wSetNodeMaterialType ( node as wNode, mat_type as wMATERIAL_FLAGS )
Описание
Определяет способ прикрепления материалов к ноду.
Node - нод в составе сцены.
mat_type - один из следующих применяемых к ноду параметров:
wMT_SOLID
Обычный рендеринг (solid). Используется только одна (первая) текстура, которая обычно является материалом типа Diffuse.
wMT_SOLID_2_LAYER
Материал с двумя слоями текстур.
Второй накладывается на первый и смешивается с ним, при этом используется alpha-параметр цветов вершин.
Данный материал пока не реализован в OpenGL.
wMT_LIGHTMAP
Тип материала со стандартно построенной картой освещённости.
Требует наличия двух текстур: первый текстурный слой - карта типа Diffuse,
второй - карта освещённости. Динамическое освещение игнорируется.
wMT_LIGHTMAP_ADD
...аналогичен предыдущему, но добавляет уровни вместо того, чтобы плавно переходить от одного к другому.
wMT_LIGHTMAP_M2
...аналогичен предыдущему, но цветовые аргументы текстурных уровней умножены на 2 для подсветки.
Аналогичен оператору D3DTOP_MODULATE2X из DirectX. Динамическое освещение игнорируется.
wMT_LIGHTMAP_M4
...аналогичен предыдущему, но цветовые аргументы текстурных уровней умножены на 4 для подсветки.
Аналогичен оператору D3DTOP_MODULATE4X из DirectX. Динамическое освещение игнорируется.
wMT_LIGHTMAP_LIGHTING
Как wMT_LIGHTMAP, но поддерживает динамическое освещение.
wMT_LIGHTMAP_LIGHTING_M2
Как wMT_LIGHTMAP_M2, но поддерживает динамическое освещение.
wMT_LIGHTMAP_LIGHTING_M4
Как wMT_LIGHTMAP_M4, но поддерживает динамическое освещение.
wMT_DETAIL_MAP
Две смешенных текстуры: первая служит цветовой схемой, вторая, в ином масштабе, управляет насыщенностью цвета для большей детализации.
Часто используется для создания ландшафтов.
wMT_SPHERE_MAP
Выглядит как отражение окружающего пространства.
wMT_REFLECTION_2_LAYER
Отражающий материал с опциональным неотражающим текстурным слоем.
Карта отражения должна стоять первой текстурой.
wMT_TRANSPARENT_ADD_COLOR
Эффект прозрачности с цветовой текстуры в качестве фона. Чем темнее цвет, тем выше прозрачность.
Используется только первая текстура. Новый цвет вычисляется добавлением исходного цвета и целевого цвета. Если такой материал применить, например, к биллборду, с чёрной фоновой текстурой и красным кругом на ней, виден будет только красный круг, причём он будет слегка прозрачным. Черный фон будет 100% прозрачным, то есть невидимым. Материал данного типа удобно использовать для работы с частицами.
wMT_TRANSPARENT_ALPHA_CHANNEL
Эффект прозрачности, который использует альфа-значение цветовой текстуры как уровень прозрачности. То есть позрачность материала зависит от альфа-канала текстуры.
Итоговый цвет получается путём смешивания целевого цвета и цветовой текстуры. При этом значение alpha-канала выступает коэффициентом смешивания. Используется только первая текстура. Если использовать этот материал с текстурами малого формата, лучше всего загружать их в 32-битном режиме.
wMT_TRANSPARENT_ALPHA_CHANNEL_REF
Добавляет материалу прозрачность, беря за основу альфа-канал цветовой текстуры. Если значение альфа-канала превышает 127, точка (пиксель) приписывается к цели, в противном случае - нет. Материал не использует альфа-смешивания и обрабатывается гораздо быстрее, чем wMT_TRANSPARENT_ALPHA_CHANNEL. Идеально для отрисовки листвы, травы и др., т.к. границы изображения не размываются и остаются чёткими.
Использует только первую текстуру. Используя этот материал с текстурами малого формата, лучше всего загружать их в 32-битном режиме.
wMT_TRANSPARENT_VERTEX_ALPHA
Эффект прозрачности, который использует альфа-параметр вершин.
wMT_TRANSPARENT_REFLECTION_2_LAYER
Эффект прозрачности и отражения. Первая текстура служит картой отражений, вторая - цветовой картой. Значение прозрачности берется из альфа-параметра вершин. Карта отражений должна стоять первой текстурой. Текстура, не предполагающая отражения, может быть добавлена второй. Обратите внимание, что пока данный тип материала реализован в OpenGL непольностью.
wMT_NORMAL_MAP_SOLID
Обычный рендеринг с использованием карты нормалей. Первая текстура - цвет, вторая - карта нормалей. Используйте только для нодов, добавленных методом wAddStaticMeshForNormalMappingToScene.
Данный шейдер может использоваться на аппаратном обеспечении с поддержкой вершинного шейдера 1.1 и пиксельного шейдера 1.1. А при их отсутствии будет использоваться материал с fixed function-освещением. Шейдер поддерживает лишь два источника освещения, при большем их количестве выбираются два ближайших.
wMT_NORMAL_MAP_TRANSPARENT_ADD_COLOR
...аналогичен предыдущему, но с эффектом прозрачности на основе фонового цвета. Чем темнее цвет, тем выше прозрачность.
wMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA
...аналогичен предыдущему, но для определения прозрачности используется альфа-значение вершин.
wMT_PARALLAX_MAP_SOLID
Похож на wMT_NORMAL_MAP_SOLID, но использует параллаксное отображение. Выглядит в разы реалистичнее, обеспечивая виртуальное замещение поверхности. Использует альфа-канал карты нормалей для замещения карты высот. Первая текстура служит цветовой схемой, вторая должна быть картой нормалей. Последняя должна содержать значение высот в альфа-компоненте. Требует вертекс-шейдера 1.1 и пиксель-шейдера 1.4.
wMT_PARALLAX_MAP_TRANSPARENT_ADD_COLOR
...подобен предыдущему, но с эффектом прозрачнсьт, добавляющим цвет к фону. Чем темнее цвет, тем выше прозрачность.
Использует wMT_TRANSPARENT_ADD_COLOR в качестве базового материала.
wMT_PARALLAX_MAP_TRANSPARENT_VERTEX_ALPHA
...как и предыдущий, но использует эффект прозрачности на основе альфа-значения высот.
Задействует wMT_TRANSPARENT_VERTEX_ALPHA в качестве базового материала.
wMT_ONE_TEXTURE_BLEND
(ещё не добавлен)
wMT_FOUR_DETAIL_MAP
Четыре изображения в оттенках серого из каналов первой текстуры перемешиваются с каналами вершин как с альфа-изображениями.
wMT_TRANSPARENT_ADD_ALPHA_CHANNEL_REF
Данный тип используется для объекта Трава (Grass), см описание функции wAddGrass .
wMT_TRANSPARENT_ADD_ALPHA_CHANNEL
(ещё не добавлен)
wMT_FORCE_32BIT = &h7fffffff
Данный параметр не используется. Он лишь включает принудительную компиляцию последовательности под 32-бита.
Пример
wSetNodeMaterialType ( WaterNode, wMT_LIGHTMAP )
// This Coppercube behavior must be attached to a 2D Overlay2, where it will show the FPS.
// Converted to CopperCube by : Gar
// Origional : Isaac Sukin
// [url]https://www.isaacsukin.com/news/2015/01/detailed-explanation-javascript-game-loops-and-timingfps-control[/url]
//
// The following embedded xml is for the editor and describes how the behavior can be edited:
// Supported types are: int, float, string, bool, color, vect3d, scenenode, texture, action
/*
<behavior jsname="behavior_fps" description="FPS counter">
</behavior>
*/
behavior_fps = function()
{
/*
var fps = 60,
framesThisSecond = 0,
lastFpsUpdate = 0;
*/
this.fps = 60;
this.framesThisSecond = 0;
this.lastFpsUpdate = 0;
/*
this.Speed = 1.0;
this.TimeOfDay = -1;
this.LastTime = -1;
*/
};
// called every frame.
// 'node' is the scene node where this behavior is attached to.
// 'timeMs' the current time in milliseconds of the scene.
// Returns 'true' if something changed, and 'false' if not.
behavior_fps.prototype.onAnimate = function(n, timeMs)
{
if (timeMs > this.lastFpsUpdate + 1000) { // update every second
this.fps = 0.25 * this.framesThisSecond + (1 - 0.25) * this.fps; // compute the new FPS
ccbSetSceneNodeProperty(n, "Text", Math.round(this.fps) + ' ');
this.lastFpsUpdate = timeMs;
this.framesThisSecond = 0;
}
this.framesThisSecond++;
}