Мастер-класс будет интересен разработчикам 2D-flash-игр – как программистам, так и художникам. За час мы попытаемся перевести социальную игру в третье измерение – сделаем прототип 3D-flash-игры. На своем примере художник-иллюстратор Павел Горбунов расскажет о собственном опыте работы с 3D-графикой под Flash, а программист Alternativa3D Андрей Копысов продемонстрирует технические приемы, создав программную “обвязку”.
How NOT to do showcase events: Behind the scenes of Midnight Show / Andrew Ko...
Alternativa Platform: Flash-игры: переходим в третье измерение
1. Flash GAMM Kyiv 2011. 10 декабря
Flash GAMM Kyiv 2011. December, 10
AlternativaPhysics: физическая симуляция на Flash – это просто
AlternativaPhysics: physics simulation on Flash is easy
Дмитрий Сергеев, Программист, AlternativaPlatform
Dmitriy Sergeev, Software Engineer, AlternativaPlatform
2. План доклада
Plan
● Введение ● Introduction
● Обзор функциональности ● Functionality review
● Обзор API ● API review
● Демо движка ● Engine demos
3. Цель доклада
Goal
Показать, что: The goal is to show that:
● AlternativaPhysics – это ● AlternativaPhysics is a
мощный и powerful and universal
универсальный движок engine
● Использовать ● The usage of
AlternativaPhysics просто AlternativaPhysics is easy
4. Что такое физический движок?
What is the physics engine?
Физический движок
Physics engine
Объекты
Objects
Физическая сцена
Physics scene
Конфигурация События
Configuration Events
Геометрия Солвер Solver
Geometry
Силы Ограничения
Forces Constraints
Определение
столкновений
Collision Позиции, скорости Столкновения, контакты
detection Positions, velocities Collisions, contacts
6. Место физики в платформе
Physics in the platform
AlternativaPlatform
Alternativa3D AlternativaCore
AlternativaEditor AlternativaPhysics
AlternativaGUI
16. Геометрия. Другие особенности
Geometry. Another Features
● Алгоритм GJK/EPA ● GJK/EPA algorithm
● Оптимизации ● Optimization
● широкая фаза ● broad phase
● статические объекты ● static objects
● Пересечение с лучом ● Ray casts
17. Ограничения на число объектов
Limitations on the Number of Objects
● Количество объектов – ● The number of objects –
до 500 при большом up to 500 in case of a
числе взаимодействий large amount of contacts
● Количество примитивов ● The number of primitives
в статических объектах in static objects –
– неограниченно unlimited
18. API
● Сцена ● Physics scene
● Конфигурация ● Engine configuration
движка ● Event handling
● Обработка событий
19. Сцена. Иерархия объектов
Scene. Hierarchy of Objects
Сцена Scene
Тело Нефизический объект
Body Non-physical object
Физический примитив
Physical primitive
Нефизический примитив Нефизический примитив
Non-physical primitive Non-physical primitive
•Материал •Material
•Подвижность •Movability
•Позиция •Position
•Позиция •Position
•Скорость •Velocity
•События •Events
•Масса •Mass
•События •Events
20. Сцена. Иерархия объектов
Scene. Hierarchy of Objects
private function PhysicsTest() {
physicsScene = PhysicsConfiguration.DEFAULT.getPhysicsScene();
var body:Body = new Body();
var box:CollisionBox = new CollisionBox(new Vector3(1, 1, 1),
CollisionType.DYNAMIC);
body.addPhysicsPrimitive(new PhysicsPrimitive(box, 10,
new PhysicsMaterial(0.5, 0.5)));
body.calculateInertiaTensor();
physicsScene.add(body);
body.setVelocity(new Vector3(1, 0, 0));
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void {
while (physicsScene.time < getTimer())
physicsScene.update(PHYSICS_STEP);
...
}
21. Сцена. Ограничения
Scene. Constraints
var boxCount:int = 3;
var boxes:Vector.<Body> = new Vector.<Body>(boxCount);
for (var i:int = 0; i < boxCount; i++) {
boxes[i] = createBox(i);
physicsScene.add(boxes[i]);
}
for (i = 0; i < boxCount - 1; i++) {
var c:ImpulseConstraint = new HingeImpulseConstraint(
boxes[i], boxes[i + 1],
new Vector3(INTERVAL, 0, 0), Vector3.ZERO,
new Vector3(0, 0, 1), new Vector3(0, 0, 1)))
physicsScene.addConstraint(c);
}
23. Конфигурация движка
Engine Configuration
● Конфигурация ● Geometry configuration
геометрии ● Solver configuration
● Конфигурация солвера
var physicsConfig:PhysicsConfiguration =
new PhysicsConfiguration();
physicsConfig.geometryConfiguration =
new GeometryConfiguration();
var solverConfig:ImpulseSolverConfiguration =
ImpulseSolverConfiguration.DEFAULT.clone();
solverConfig.contactIterations = 4;
physicsConfig.solverConfiguration = solverConfig;
var physicsScene:PhysicsScene =
physicsConfig.getPhysicsScene();
24. События
Events
● Предобработка сцены ● Before update
(onBeforeUpdate) ● After update
● Постобработка сцены ● Contact
(onAfterUpdate)
● With body
● Возникновение контакта
● WIth primitive
● С телом
● С примитивом
25. События
Events
public class SimFlag extends SimObject {
public function SimFlag(position:Position, onContact:Function) {
...
cylinder = new CollisionCylinder(r, 3, CollisionType.TRIGGER);
cylinder.addEventListener(ContactEvent.OnContact, onContact, this);
...
}
...
}
public class BallDemo {
public function BallDemo() {
...
add(new SimFlag(Position.createXYZ(-4, -4, 0), takeFlag));
...
}
private function takeFlag(event:ContactEvent):void {
...
flag = (event.userData as SimFlag);
flag.visible = false;
}
...
}
29. Спасибо за внимание
Thanks for your attention
пожалуйста, задавайте вопросы,
пишите на
sergeev@alternativaplatform.com
please ask your questions,
feel free to contact me:
sergeev@alternativaplatform.com