цель:
представить рабочие помещения с работниками в 3D с Java3D,
для начала схематично (кубики там, треугольнички),
с изменением статуса (на месте, не на месте и т.д. и т.п.) в realtime
дано:
все данные о работниках, географии и т.д. есть,
есть JavaApplet с таблицей работников, realtime
опыт работы с java и немного openGL, DirectX
вопрос:
как "должна" выглядеть архитектура такого приложения?
дополнение:
вопрос не по java. просто никогда не мог понять как писать большие 3D приложения.
все эти матрицы ... не могу понять как это красиво упаковать в классы
прошу не начинать дискусси о моральной стороне этого вопроса,
за деньги я пишу всё (конечно кроме детской порнографии и другой гадости)
Здравствуйте, Zubkin, Вы писали:
Z>цель: Z>представить рабочие помещения с работниками в 3D с Java3D, Z>для начала схематично (кубики там, треугольнички), Z>с изменением статуса (на месте, не на месте и т.д. и т.п.) в realtime
Z>вопрос: Z>как "должна" выглядеть архитектура такого приложения?
Ну, обычно в 3D выделяют несколько общеупотребительных примитивов:
Вершина -- просто вектор в 3d. Грань (треугольная) в виде ссылок на три точки, на которых она построена, иногда вместе с текстурными координатами.
Список вершин и граней называется mesh, иногда вместе с некоторой дополнительной информацией (группы сглаживания итп). Ближайший аналог — кривая в векторном редакторе. Модель -- список логически связанных mesh'ей и некоторой другой информации (например, назначение материалов). Причин тому несколько: для некоторых алгоритмов может быть более удобным иметь только выпууклые mesh'и, соответственно, невыпуклые фигуры придется представлять в виде их совокупности; кроме того может быть удобно иметь отдельно чисто геометрическую информацию (mesh) и дополнительную (материалы и текстуры), итд итп. Например, модели танкиста и пилота могут использовать одинаковый меш, представляющий тушку человека, но разные его раскраски. Граф сцены -- структура данных, содержащая список всех объектов в сцене и информацию об их подчинении, например руки подчинены туловищу, туловище -- креслу (если человек на нем сидит). Для каждого объекта известен список его трансформаций (вращение, масштаб, параллельный перенос) относительно родительского объекта. Таким образом, конкретные трансформации для каждого объекта получаются путем суперпозиции его собственного стека с родительскими.
Это самый базовый вариант, дальше уже можно наворачивать. Вопрос анимации, кстати, совершенно отдельная штука. Один из способов -- это использовать т.наз. контроллеры. По сути, это -- некий генератор плавно (обычно) меняющейся функции времени, выходом которой является либо скаляр либо вектор (кстати, еще одна тема -- это способ интерполяции: slerp, lerp или еще что-то). Опорные точки задаются пользователем (t=0,x=0, dx/dt=0 при x<-0, t=10, x=100, dx/dt=0 при x->0, поехали). Выход контроллера напрямую управляет какой либо трансформацией конкретного объекта.
Здравствуйте, Кирилл Лебедев, Вы писали:
КЛ>Здравствуйте, Zubkin, Вы писали:
Z>>как "должна" выглядеть архитектура такого приложения?
КЛ>А что должно делать приложение, кроме как представлять "рабочие помещения с работниками в 3D с Java3D"?
да в сущности нечего другого не требуеться
но если посмотреть конкретно:
мне "видеться" просто именно помещение,
там столы, за каждым работник.
по фигуре (или по цвету) работника видно что он делает.
можно крутить камерой и двигаться вперёд/назад.
карту помещения хочу загружать через сеть,
также и объекты. это не вопрос, там я сам могу разобраться
меня интересует именно 3D-часть. данные от рабонтиках и т.д.
я предоставлю через сеть, есть готовый код.
Здравствуйте, Eugene Kilachkoff, Вы писали:
Z>>вопрос: Z>>как "должна" выглядеть архитектура такого приложения? EK>Ну, обычно в 3D выделяют несколько общеупотребительных примитивов:
благодарю за ответ.
если я правильно понял,
я должен создать классы для этих общеупотребительных примитивов,
каждый описывает своё состояние (вращение, scale и т.д.),
все объекты храняться в одной структуре,
потом есть Scenegraph который регуларно проходит по структуре
и "рисует" эти примитивы.
Здравствуйте, 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);
}
}
Здравствуйте, 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>
спасибо, теперь стало немного понятнее, могу начинать ковыряться
Здравствуйте, Zubkin, Вы писали:
КЛ>>А что должно делать приложение, кроме как представлять "рабочие помещения с работниками в 3D с Java3D"? Z>да в сущности нечего другого не требуеться
Программ без функционала не бывает. Если Заказчик не рассказал о функционале в начале работы над программой, а Вы — не позаботились об этом узнать, будьте готовы, что ближе к завершению проекта Заказчик попросит Вас внести в программу ряд фич, без которых ее не примет. При этом внесение этих фич будет достаточно кровавым, т.к. архитектура программы их не будет предусматривать.
Z>мне "видеться" просто именно помещение,
Очень важно понять, что "видится" Заказчику. В том числе, узнать, как Заказчик будет эту программу применять.