вопрос к архитектуре 3D приложения
От: Zubkin  
Дата: 04.07.06 08:33
Оценка:
приветствую коллеги.

цель:
представить рабочие помещения с работниками в 3D с Java3D,
для начала схематично (кубики там, треугольнички),
с изменением статуса (на месте, не на месте и т.д. и т.п.) в realtime

дано:
все данные о работниках, географии и т.д. есть,
есть JavaApplet с таблицей работников, realtime
опыт работы с java и немного openGL, DirectX

вопрос:
как "должна" выглядеть архитектура такого приложения?

дополнение:
вопрос не по java. просто никогда не мог понять как писать большие 3D приложения.
все эти матрицы ... не могу понять как это красиво упаковать в классы

прошу не начинать дискусси о моральной стороне этого вопроса,
за деньги я пишу всё (конечно кроме детской порнографии и другой гадости)


заранее благодарю

Зубкин
Re: вопрос к архитектуре 3D приложения
От: Кирилл Лебедев Россия http://askofen.blogspot.com/
Дата: 04.07.06 09:16
Оценка:
Здравствуйте, Zubkin, Вы писали:

Z>как "должна" выглядеть архитектура такого приложения?


А что должно делать приложение, кроме как представлять "рабочие помещения с работниками в 3D с Java3D"?
С уважением,
Кирилл Лебедев
Software Design blog — http://askofen.blogspot.ru/
Re: вопрос к архитектуре 3D приложения
От: Eugene Kilachkoff Россия  
Дата: 04.07.06 09:19
Оценка:
Здравствуйте, Zubkin, Вы писали:

Z>цель:

Z>представить рабочие помещения с работниками в 3D с Java3D,
Z>для начала схематично (кубики там, треугольнички),
Z>с изменением статуса (на месте, не на месте и т.д. и т.п.) в realtime

Z>вопрос:

Z>как "должна" выглядеть архитектура такого приложения?
Ну, обычно в 3D выделяют несколько общеупотребительных примитивов:
Это самый базовый вариант, дальше уже можно наворачивать. Вопрос анимации, кстати, совершенно отдельная штука. Один из способов -- это использовать т.наз. контроллеры. По сути, это -- некий генератор плавно (обычно) меняющейся функции времени, выходом которой является либо скаляр либо вектор (кстати, еще одна тема -- это способ интерполяции: slerp, lerp или еще что-то). Опорные точки задаются пользователем (t=0,x=0, dx/dt=0 при x<-0, t=10, x=100, dx/dt=0 при x->0, поехали). Выход контроллера напрямую управляет какой либо трансформацией конкретного объекта.
Re[2]: вопрос к архитектуре 3D приложения
От: Zubkin  
Дата: 04.07.06 09:26
Оценка:
Здравствуйте, Кирилл Лебедев, Вы писали:

КЛ>Здравствуйте, Zubkin, Вы писали:


Z>>как "должна" выглядеть архитектура такого приложения?


КЛ>А что должно делать приложение, кроме как представлять "рабочие помещения с работниками в 3D с Java3D"?


да в сущности нечего другого не требуеться

но если посмотреть конкретно:

мне "видеться" просто именно помещение,
там столы, за каждым работник.
по фигуре (или по цвету) работника видно что он делает.
можно крутить камерой и двигаться вперёд/назад.

карту помещения хочу загружать через сеть,
также и объекты. это не вопрос, там я сам могу разобраться

меня интересует именно 3D-часть. данные от рабонтиках и т.д.
я предоставлю через сеть, есть готовый код.

Зубкин
Re[2]: вопрос к архитектуре 3D приложения
От: Zubkin  
Дата: 04.07.06 09:34
Оценка:
Здравствуйте, Eugene Kilachkoff, Вы писали:

Z>>вопрос:

Z>>как "должна" выглядеть архитектура такого приложения?
EK>Ну, обычно в 3D выделяют несколько общеупотребительных примитивов:

благодарю за ответ.

если я правильно понял,
я должен создать классы для этих общеупотребительных примитивов,
каждый описывает своё состояние (вращение, scale и т.д.),
все объекты храняться в одной структуре,
потом есть Scenegraph который регуларно проходит по структуре
и "рисует" эти примитивы.

Зубкин
Re[3]: вопрос к архитектуре 3D приложения
От: Eugene Kilachkoff Россия  
Дата: 04.07.06 11:30
Оценка:
Здравствуйте, Zubkin, Вы писали:

Z>Здравствуйте, Eugene Kilachkoff, Вы писали:


Z>>>вопрос:

Z>>>как "должна" выглядеть архитектура такого приложения?
EK>>Ну, обычно в 3D выделяют несколько общеупотребительных примитивов:

Z>благодарю за ответ.


Z>если я правильно понял,

Z>я должен создать классы для этих общеупотребительных примитивов,
Ну примерно. Типа далее псевдокод.
class Vector { float x,y,z; }
class Face { int idx1,idx2,idx3; }
class Mesh { Vector[] vertices; Face[] faces; }
// ну и так далее


Z>каждый описывает своё состояние (вращение, scale и т.д.),

Немного не так.
class Matrix
{
  float[4][4] data;
  static Matrix buildI()
  {
    return ( [ 1  0  0  0 ],
             [ 0  1  0  0 ],
             [ 0  0  1  0 ],
             [ 0  0  0  1 ] );
  }

  static Matrix buildT(Vector v)
  {
    return ( [ 0  0  0  v.x ],
             [ 0  0  0  v.y ],
             [ 0  0  0  v.z ],
             [ 0  0  0  1   ] );
  }

  // далее как в учебнике
  static Matrix buildRotX(float angle) ...
  static Matrix buildRotY(float angle) ...  
  static Matrix buildRotZ(float angle) ...  
}

class TransformationStack
{
    Matrix[] transformations;
    void push(Matrix m) { transformations.append(m); }
    Matrix collapse()
    {
       Matrix r = Matrix.buildI();
       foreach(m in transformations) r = m * r;
       // вообще, справа или слева умножать зависит от того, в каком порядке хранятся матрицы в стеке
       // и от представления векторов.
       // обычно предполагается что используются вектор-столбцы и они умножаются на матрицу справа
       // соответственно, для набора преобразований "R: поворот на 30", затем "T: перенос в (1,0,0)"
       // результирующий вектор должен получаться как Vr = T * R * v
       return r;
    }
}

class Object3D
{
  Mesh[] meshes;
  TransformationStack tstack;
  String name;
}

Можно еще использовать представление вращения в виде кватернионов (google for quaternion rotation).

Z>все объекты храняться в одной структуре,

Z>потом есть Scenegraph который регуларно проходит по структуре
Scenegraph -- это и есть структура.
class SceneGraph
{
  class Group { WeakReference<Object3D>[] members; }
  class TreeNode { WeakRefernce<Object3D> object; TreeNode parent; TreeNode[] child; }

  Object3D[] objectPool; // хранилище всех объектов, чтобы не бегать долго по деревьям
  Group[] groupList; // логическая группировка (ex: голова -- это глаза, плюс уши, плюс зубы и так далее)
  TreeNode[] kinematicTreeRoots; // лес деревьев подчинения объектов для прямой (forward) кинематики
  // (если потянуть за туловище, голова, руки и ноги потянутся за ним.
  // НО, если потянуть за ногу, все остальное останется на месте, для этого нужна уже inverse kinematics

  void drawAll()
  {
     foreach(node in kinematicTreeRoots) drawRecursive(node,Matrix.buildI());
     // те, которые сами по себе. Хотя для них лучше ввести отдельный root.
     foreach(obj in objectPool)
       if wasNotDrawnInPreviousStep(obj) drawObject(obj);
  }

  void drawRecursive(TreeNode node,Matrix parentTransform)
  {
     foreach(n in node.child) drawRecursive(n,n.object.tstack.collapse());
     Matrix myTransform = node.object.tstack.collapse() * parentTransform; // watch the order !
     Mesh m = transformMesh(node.object.mesh, myTransform);
     drawMesh(m);         
  }
}
Re[4]: вопрос к архитектуре 3D приложения
От: Zubkin  
Дата: 04.07.06 12:11
Оценка:
Здравствуйте, Eugene Kilachkoff, Вы писали:

Z>>если я правильно понял,

Z>>я должен создать классы для этих общеупотребительных примитивов,
EK>Ну примерно. Типа далее псевдокод.
EK>
EK>class Vector { float x,y,z; }
EK>class Face { int idx1,idx2,idx3; }
EK>class Mesh { Vector[] vertices; Face[] faces; }
EK>// ну и так далее
EK>


спасибо, теперь стало немного понятнее, могу начинать ковыряться
Re[3]: вопрос к архитектуре 3D приложения
От: Кирилл Лебедев Россия http://askofen.blogspot.com/
Дата: 07.07.06 07:41
Оценка: 1 (1)
Здравствуйте, Zubkin, Вы писали:

КЛ>>А что должно делать приложение, кроме как представлять "рабочие помещения с работниками в 3D с Java3D"?

Z>да в сущности нечего другого не требуеться

Программ без функционала не бывает. Если Заказчик не рассказал о функционале в начале работы над программой, а Вы — не позаботились об этом узнать, будьте готовы, что ближе к завершению проекта Заказчик попросит Вас внести в программу ряд фич, без которых ее не примет. При этом внесение этих фич будет достаточно кровавым, т.к. архитектура программы их не будет предусматривать.

Z>мне "видеться" просто именно помещение,


Очень важно понять, что "видится" Заказчику. В том числе, узнать, как Заказчик будет эту программу применять.
С уважением,
Кирилл Лебедев
Software Design blog — http://askofen.blogspot.ru/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.