forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на JavaME (http://forum.boolean.name/forumdisplay.php?f=114)
-   -   создание 3Д движка на j2me (http://forum.boolean.name/showthread.php?t=8365)

WISHMASTER35 14.06.2009 02:02

Ответ: создание 3Д движка на j2me
 
Не пойму зачем в short конвертировать? Пусть бы int возращало. Хотя так памяти меньше берёт.
Кстати, ты тоже 3д движок делаеш?
Можеш объяснить почему некоторые движки медленные, а некоторые быстрые? Вроде все алгоритмы не засекречены и каждый может использовать лучший алгоритм, но нет, некоторые игры летают, а некоторые несмотря на свою простоту тормазят.

WISHMASTER35 14.06.2009 15:56

Ответ: создание 3Д движка на j2me
 
Можеш формулу написать как перемножать матрици 4*4. А то у меня какая-то фигня получается.

impersonalis 14.06.2009 16:56

Ответ: создание 3Д движка на j2me
 
Вложений: 1
матрицЫ 4х4 перемножаются так:

impersonalis 14.06.2009 17:06

Ответ: создание 3Д движка на j2me
 
Вложений: 1
Вот так выглядит цикл умножения:

WISHMASTER35 14.06.2009 18:02

Ответ: создание 3Д движка на j2me
 
Я не пойму. Есть у меня матрица matrix и matrixTemp. matrix я задаю z-позицию = 600. А matrixTemp задаю Х угол 5. Потом matrix умножаю на matrixTemp и matrix поворачивается, НО почему-то позиция становится = 0. По-моему этого не должно быть. Или должно?

-=Jack=- 14.06.2009 18:18

Ответ: создание 3Д движка на j2me
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 107511)
Не пойму зачем в short конвертировать? Пусть бы int возращало. Хотя так памяти меньше берёт.
Кстати, ты тоже 3д движок делаеш?
Можеш объяснить почему некоторые движки медленные, а некоторые быстрые? Вроде все алгоритмы не засекречены и каждый может использовать лучший алгоритм, но нет, некоторые игры летают, а некоторые несмотря на свою простоту тормазят.

Зависит от прямоты рук разработчика.

Цитата:

Сообщение от WISHMASTER35 (Сообщение 107511)
Можеш формулу написать как перемножать матрици 4*4. А то у меня какая-то фигня получается.

Код:

public static Matrix4x4 operator *(Matrix4x4 left, Matrix4x4 right)
        {
            Matrix4x4 t = new Matrix4x4();

            for (int i = 1; i <= 4; i++)
                for (int j = 1; j <= 4; j++)
                {
                    float r = 0;
                    for (int p = 1; p <= 4; p++)
                        r += left[i, p] * right[p, j];
                    t[i, j] = r;
                }

            return t;
        }

На Java переводи сам... left и right - умножаемые матрицы, t - результат. Тут у класса матрицы есть двумерный индексатор, потому можно получить доступ к элементам как к двумерному массиву(например t[i, j]).
На сколько мне известно, разработчики Java сочли не нужной перегрузку операторов. Такчто придётся тебе попарится с переводом :(

WISHMASTER35 14.06.2009 18:39

Ответ: создание 3Д движка на j2me
 
Вот http://upwap.ru/455066 сделал свет и матрицу. Но в матрице, в методе mul навернае какая-то ошибка т.к. модель постеменно сжимается. Можете проверить мою матрицу.

-=Jack=- 14.06.2009 21:04

Ответ: создание 3Д движка на j2me
 
>Вот http://upwap.ru/455066
Где jar? >(

А что это у тебя за арифметика странная?? Почему везде int??

WISHMASTER35 14.06.2009 21:21

Ответ: создание 3Д движка на j2me
 
jar в папке dist. Арифметика не странная, а с фиксированной точкой. Операции с float в раз 5 медленее.
И изменяется длинна вектора из-за моего фиксед поинт :-( . А float использовать - фпс сильно понизится. В матрице маскота тоже везде fixed point, и в матрице. И длинна векторов там почти не меняется.
Как вориант можно нормализировать длинну векторов, но это долго из-за корня. И это не выход т.к. нельзя будет масштабировать вектор. А в маскоте я вручную(умноженйем и делением) менял длинну вектора и она потом такой и оставалась т.е. не нормализировалась.

WISHMASTER35 14.06.2009 22:28

Ответ: создание 3Д движка на j2me
 
Я уже и float сделал, но всё равно модель постепенно сжимается. Может у меня не правельно умножаются матрицы?

WISHMASTER35 15.06.2009 00:03

Ответ: создание 3Д движка на j2me
 
Нашол ошибку. Не надо было изменения сразу же записывать.
Но теперь не пойму почему при умножении на матрицу переноса моя матрица не переносится. Вот http://upwap.ru/455417 посмотрите почему не работает матрица переноса.

-=Jack=- 15.06.2009 01:25

Ответ: создание 3Д движка на j2me
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 107583)
Но теперь не пойму почему при умножении на матрицу переноса моя матрица не переносится. Вот http://upwap.ru/455417 посмотрите почему не работает матрица переноса.

А где находится код? Кстати, для указания позиции не обязательно множить твою матрицу на матрицу позиции. Достаточно заполнить последнюю строку матрицы как |x y z 1| где (x; y; z) - позиция объекта.


ЗЫ: setIdentity не дописана.

WISHMASTER35 15.06.2009 01:39

Ответ: создание 3Д движка на j2me
 
1. Какой код? Код умножения матриц в классе матрици - метод mul.
2. Почему setIndetity не дописана?
3. Меня больше тревожит почему матрица при умножении на матрицу поворота теряет свои позиции. В маскоте такого не было. И при умножении на матрицу переноса - матрица нормально переносилась. А у меня с этим проблемы.

-=Jack=- 15.06.2009 09:52

Ответ: создание 3Д движка на j2me
 
>2. Почему setIndetity не дописана?
4я строка матрицы не заполняется. Возможно, от этого и проблемы с позиционированием.

WISHMASTER35 15.06.2009 12:22

Ответ: создание 3Д движка на j2me
 
4я строчка и не изменяется.
Там ошибка была в том, что я изменял не те переменные (надо было изменять t03,t13,t23) и надо было вызывать метод toFP. Вот http://upwap.ru/455867 по-исправлял эти ошибки.
Там еще можно сделать, что-то быстрее или лучше?

WISHMASTER35 15.06.2009 14:12

Ответ: создание 3Д движка на j2me
 
Вложений: 2
вот выкладую в форум, а то upwap файлы не долго хранит.
Добавил управление светом и немного улучшил конвертер.

WISHMASTER35 15.06.2009 16:21

Ответ: создание 3Д движка на j2me
 
Не знаете, что надо сделать с проектом javaSE, чтобы в манифест главный класс записывался?

-=Jack=- 15.06.2009 19:55

Ответ: создание 3Д движка на j2me
 
Кажись у тебя немного неправильно рассчитана матрица проэкции.
Тут это хорошо видно:
^Вид спереди. Ушей почти не видно
^Вид сзади. Уши торчат на весь экран.

WISHMASTER35 15.06.2009 20:45

Ответ: создание 3Д движка на j2me
 
Модель такая. На маскоте она тоже так себя ведёт http://upwap.ru/456527 чем ближе модель тем больше глаза закрывают уши.

-=Jack=- 15.06.2009 21:08

Ответ: создание 3Д движка на j2me
 
И всё-же при повороте это выглядит кривовато <_<

WISHMASTER35 15.06.2009 21:13

Ответ: создание 3Д движка на j2me
 
Ну не знаю. Подскажи, что там не правельно расчитывается. Длинна векторов там одинаковая. Смотрят они все в свои стороны. Что еще может быть?

WISHMASTER35 17.06.2009 13:31

Ответ: создание 3Д движка на j2me
 
Вложений: 2
Cделал новую версию. Изменил формат файла и теперь он меньше весит и легче грузится. Некоторые int заменил на short. Упростил вычисление света. Добавил метод масштабирования матрици, хотя при изменении длинны нормали свет перестаёт работать. Вроде всё.
Не подскажите, что там еще можно улучшить?

WISHMASTER35 20.06.2009 14:29

Ответ: создание 3Д движка на j2me
 
Вложений: 2
Поменял интерфейс на супер класс и фпс вырас на 7 ! :super:

WISHMASTER35 21.06.2009 00:21

Ответ: создание 3Д движка на j2me
 
Кто нибудь знает как сделать, если один полигон перекрывает часть другова, то как не рисовать перекрытую часть второго полигона?

WISHMASTER35 21.06.2009 00:23

Ответ: создание 3Д движка на j2me
 
Не знает алгоритм "быстрая сортировка" это самый быстрый алгоритм или есть лучше?

jimon 21.06.2009 04:12

Ответ: создание 3Д движка на j2me
 
WISHMASTER35
ну смотря для каких целей

WISHMASTER35 21.06.2009 11:25

Ответ: создание 3Д движка на j2me
 
Цель у меня - быстрее. А какие цели могут быть?

jimon 21.06.2009 12:34

Ответ: создание 3Д движка на j2me
 
WISHMASTER35
не бывает просто "самого быстрого алгоритма сортировки"
потому что если ты выберешь один, а потом подсунешь ему 10 млн ячеек то он загнётся
для выбора алгоритма надо смотреть как уже упорядочены входные данные и какое количество обьектов надо отсортировать

для <=1000 самый быстрый это сортировка шелла

WISHMASTER35 21.06.2009 14:05

Ответ: создание 3Д движка на j2me
 
С сортировкой Шелла фпс вырос на 16. Это очень хорошо.
А нельзяли этот алгоритм еще как нибудь оптимизировать? Может быть ту таблицу изменить которая используется этим алгоритмом? Я толком не понял для чего та таблица, но там такие большие числа, а у меня полигонов максимум 1000.

jimon 21.06.2009 14:13

Ответ: создание 3Д движка на j2me
 
WISHMASTER35
изучай алгоритмы сортировки :) может и можно

WISHMASTER35 21.06.2009 15:17

Ответ: создание 3Д движка на j2me
 
Я так понимаю, если у меня максимум полигонов 1000, то заносить в ту таблицу числа больше 1000 смысла нет. Правельно?

-=Jack=- 22.06.2009 15:36

Ответ: создание 3Д движка на j2me
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 108392)
Кто нибудь знает как сделать, если один полигон перекрывает часть другова, то как не рисовать перекрытую часть второго полигона?

Повторяю для тех, кто в танке:
Цитата:

Сообщение от -=Jack=- (Сообщение 107168)
Для этого вполне эффективно используется Z-буферизация о_О


WISHMASTER35 23.06.2009 00:21

Ответ: создание 3Д движка на j2me
 
Вложений: 2
вот мой двихок с сортировкой Шелла.

WISHMASTER35 23.06.2009 00:26

Ответ: создание 3Д движка на j2me
 
Не пойму как твоя з-буфферизация мне в этом поможет.
Врё равно праверяться перекрывает пиксель одного полигона пиксель другова будет у всех полигонов.

-=Jack=- 23.06.2009 01:40

Ответ: создание 3Д движка на j2me
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 108678)
Врё равно праверяться перекрывает пиксель одного полигона пиксель другова будет у всех полигонов.

Допустим. И в чём проблема?

Слушай, иди попрогай на OpenGL на компе, а потом уже перейдешь на Java... Ты ничего не выдавишь из этого, если не будешь знать основ графики... По программированию 3Д графики на Java книг мало(если вообще есть, хз), а вот по OpenGL - целая куча. Даже если не будешь программировать под комп - прочитай хотя бы одну умную книгу по OpenGL и у тебя сразу отпадёт куча вопросов, которые ты тут задаешь...

WISHMASTER35 23.06.2009 10:17

Ответ: создание 3Д движка на j2me
 
Проблема в том, что на не видемые полигоны или их части потратится время.
А я хочю, если на дисплее в этом месте уже рисовался полигон, то в следующем полигоне его части, которые в этом месте вообще пропуститились и не делать для них каких-то вычислений.
Но в этом случае навена надо будет рисовать полигоны от ближнего к дальнему.
Книгу еще надо скачать. А когда они весят 20, а то и 50 мб это проблематично.

-=Jack=- 23.06.2009 12:08

Ответ: создание 3Д движка на j2me
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 108699)
Проблема в том, что на не видемые полигоны или их части потратится время.

А ты что думал, в сказку попал?
Цитата:

Сообщение от WISHMASTER35 (Сообщение 108699)
А я хочю, если на дисплее в этом месте уже рисовался полигон, то в следующем полигоне его части, которые в этом месте вообще пропуститились и не делать для них каких-то вычислений.

Или юзай Z-буферизацию, или хоти дальше...

Цитата:

Сообщение от WISHMASTER35 (Сообщение 108699)
Но в этом случае навена надо будет рисовать полигоны от ближнего к дальнему.

доу... страшно представить, как это будет выглядить...

Цитата:

Сообщение от WISHMASTER35 (Сообщение 108699)
Книгу еще надо скачать. А когда они весят 20, а то и 50 мб это проблематично.

http://depositfiles.com/ru/files/4304985 - 10.3 мб
http://depositfiles.com/ru/files/7657084 - 2.93 мб
http://depositfiles.com/files/yon7cmqy7 - 17 мб.

WISHMASTER35 23.06.2009 18:18

Ответ: создание 3Д движка на j2me
 
Положительная сторона з-буфера это, то, что точно определяется какой пиксель виден, а какои нет. И для не видемых пикселей не надо высчитавать свет и текстурные координаты. Но для каждого полигона, для каждого эго пикселя надо надо высчитать расстояние. А это наверна очень долго. Формула которая высчитует это расстояние большая?
По-моему я когда-то видел статью в которой написано было, что не видемые части полигона надо отсекать.

-=Jack=- 23.06.2009 20:32

Ответ: создание 3Д движка на j2me
 
>Формула которая высчитует это расстояние большая?
vec=pos*WorldViewProj; - тут vec.z - это и будет та координата. Если не понял - vec=pos*(WorldMatrix*ViewMatrix*ProjMatrix); - это код вычисления положения пикселя на экране. В любом случае должен выполнятся при отрисовке. При этом значения X и Y - значения в пределах [-1; 1], указывающие положение результирующей точки на экране, а Z(используется только при Z-буферизации) - значение в пределах [0; 1], которое и нужно записать в Z-буфер.

WISHMASTER35 23.06.2009 22:15

Ответ: создание 3Д движка на j2me
 
Как я понял освещение и цвет пикселов вычисляются после того как все полигоны добавлены в з-буфер.
Только я не понял, если в з-буфер сначало не цвета заносятся, то что???

jimon 23.06.2009 22:23

Ответ: создание 3Д движка на j2me
 
WISHMASTER35
z-buffer это такая текстура, мы сначала высчитываем глубину пикселя и сравниваем с уже записаной, если записаная меньше - игнорируем наш пиксель и идем к другому
если записаная больше, высчитываем цвет для нашего пикселя, записываем цвет в результирующий буфер, записуем глубину в z-buffer

WISHMASTER35 23.06.2009 23:10

Ответ: создание 3Д движка на j2me
 
Вычисляем цвет, а потом этот цвет еще 100 раз замазываем.

jimon 23.06.2009 23:41

Ответ: создание 3Д движка на j2me
 
WISHMASTER35
для того z-buffer и придумали, ты рисуешь полигоны от ближнего к заднему, при этом цвет ты вычисляешь только для ближних, потому что задние стоят за ближними и отсекаются z-buffer'ом

WISHMASTER35 23.06.2009 23:42

Ответ: создание 3Д движка на j2me
 
Я хотел сделать, чтобы в з-буфер записывалась ссылка на полигон. А потом когда все полигоны записаны в массив брать каждую ссылку на полигон и рисовать тот пиксель. Так бы лишний раз цвет не вычислялся. Но запись ссылок в массив это очень медленно. Хотя можно записывать номера полигонов. Но хз как потом определить цвет пикселя. Вообщем была такая тупая идея.

jimon 23.06.2009 23:45

Ответ: создание 3Д движка на j2me
 
WISHMASTER35
парень, ты с какой планеты ?
я тебе обьяснил нормальным языком, рисуем полигон, получаем глубину пикселя, если z-buffer говорит о том что этот пиксель ВИДИМ - вычисляем для него цвет и рисуем на экран
если он НЕВИДИМ - цвет вычислять НЕ НАДО !

WISHMASTER35 23.06.2009 23:47

Ответ: создание 3Д движка на j2me
 
Интересно на сколько понизит фпс вычисление глубины пикселя.
Еще сильно мешает какая-то фигня. Если заполнять массив и рисовать ргб массив, то фпс сильно понижается. А если это делать по-отдельности, то фпс почти не понижается.
П.с. Я лучше буду использовать вместо сравнения глубины пикселя boolean. Всё равно полигоны уже отсортированы.

-=Jack=- 25.06.2009 19:34

Ответ: создание 3Д движка на j2me
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 108805)
Интересно на сколько понизит фпс вычисление глубины пикселя. Еще сильно мешает какая-то фигня. Если заполнять массив и рисовать ргб массив, то фпс сильно понижается. А если это делать по-отдельности, то фпс почти не понижается.
П.с. Я лучше буду использовать вместо сравнения глубины пикселя boolean. Всё равно полигоны уже отсортированы.

Блин... Ты уверен что тебе нужно писать движёк??? Мой тебе совет - забей на него, пока не скачаешь(или не купишь) соответствующую литературу, и не перестанешь писать такие глупости...

abcdef 26.06.2009 10:41

Ответ: создание 3Д движка на j2me
 
WISHMASTER35 - если делать 3D-кубик, дальше этой цели не уйдете.
Полигоны - это для простых фигур, а если видна только часть полигона, то простейшее решение это z-buffer.
____
касательно j2me: если хотите сделать свой 3D-движек, и чтоб это работало с приемлемой скоростью, необходимо использовать минимум 3D-граней, и ограничить размеры области вывода, например 100x75 pixels и т.д.
Сортировка граней - это доп.оптимизация, когда будет уже реально работающий проект, которая покажет целесообразность применения, или полный отказ от этого метода, в связи с качеством отображения и скоростью работы в целом.
____
простой 3D алгоритм рисования текстурированных граней c z-buffer'ом (TurboPascal)
www.boolean.name > Проекты > Проекты на MidletPascal > The Maze > demo.zip (искать на первых страницах)
url: http://forum.boolean.name/attachment...achmentid=4983

WISHMASTER35 26.06.2009 17:38

Ответ: создание 3Д движка на j2me
 
Минимум граний и минимум разрешения это само-собой. Только 100-75 очень мало.

WISHMASTER35 27.06.2009 02:34

Ответ: создание 3Д движка на j2me
 
Кстати, в з-буфер можно записывать не глубину пикселя, а номер конца горизонтальной линии. А потом когда рисовать, если -1, то нарисовать точки, если, что-то другое, то перейти на этот конец линии. Таким образом пропускаем лишний цикл и проверки. Мне оно прибавило где-то 1 фпс.
Вот http://upwap.ru/469108 сделал, чтобы рисовалось в ргб массив. Теперь, даже, если фигура не видна, то фпс и до 50 почему-то недоходит.

jimon 27.06.2009 13:14

Ответ: создание 3Д движка на j2me
 
WISHMASTER35
если вся модель не попадает в срезаную пирамиду "зрения" камеры, то её просто не нужно посылать на рендер, обычно вокруг модели строят параллелепипед и проверяют попадает ли он или его часть в срезаную пирамиду

-=Jack=- 27.06.2009 13:29

Ответ: создание 3Д движка на j2me
 
Цитата:

Сообщение от jimon (Сообщение 109243)
обычно вокруг модели строят параллелепипед

Я строю сферу <_< конечно для плоских моделей создается слижком большая сфера, но зато вместо 48и дотов только 6 :)

WISHMASTER35 27.06.2009 13:34

Ответ: создание 3Д движка на j2me
 
У меня сейчас каждый полигон проверяется виден ли на дисплее. И фпс это не забрало.

WISHMASTER35 27.06.2009 18:22

Ответ: создание 3Д движка на j2me
 
Вот исходники http://upwap.ru/469622 движка с рисованием в массив.
Но теперь там какая-то мистика. Один простейший метод G3D.clear заберает аж 50 фпс. Как это можно исправить? Или это баг джава-машины?

WISHMASTER35 27.06.2009 22:17

Ответ: создание 3Д движка на j2me
 
Не, использовать з-буфер или какой-то другой массив нельзя. Чтобы, только его заполнить надо много фпс потратить. Надо одним массивом обойтись. Может сделать, если цвет пикселя равен -1, то рисовать в этот пиксель. Или другое число вместо -1.

WISHMASTER35 28.06.2009 11:50

Ответ: создание 3Д движка на j2me
 
A без очистки з-буфера можно как-то обойтись?

-=Jack=- 28.06.2009 12:38

Ответ: создание 3Д движка на j2me
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 109294)
A без очистки з-буфера можно как-то обойтись?

Нет.

WISHMASTER35 28.06.2009 17:10

Ответ: создание 3Д движка на j2me
 
Сдесь http://ru.wikipedia.org/wiki/Z-буферизация написано, что чтобы не заполнять буфер каким-то числом часто делают так: первый кадр буферизация настраивается так, чтобы глубина ближних объектов была 0 ,0 , а дальних - 0 ,5 . Второй кадр - от 1 ,0 до 0 ,5 . Это снижает точность на 1 бит, но позволяет избавиться от очистки буфера.
Но я, что-то не пойму как это.
Можете доходчевее объяснить.

-=Jack=- 28.06.2009 21:54

Ответ: создание 3Д движка на j2me
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 109318)
Можете доходчевее объяснить.

Очистка при этом всё-ровно требуется, но не каждый кадр, а через один.

1. чистим буфер
2. рендерим кадр №1, считаем значения глубины для пикселей. При этом если значение>=1 записываем 0.5, иначе - множим значение на 0.5 и пишем его в буфер.
3. рендерим кадр №2, считаем значения глубины для пикселей. При этом если значение>=1 записываем 1, иначе - множим значение на 0.5, добавляем к результату 0.5 и пишем его в буфер.
4. идём к пункту 1

WISHMASTER35 29.06.2009 16:44

Ответ: создание 3Д движка на j2me
 
У меня, есть идея.
Записывать в з-буфер номер текущего кадра. А потом проверять, если текущий кадр=100 и в з-буфере=100, то этот пиксель уже рисовался в этом кадре.
Таи можно будет очистку з-буфера очень редко. Или вообще не делать.
Как идея?

WISHMASTER35 29.06.2009 19:07

Ответ: создание 3Д движка на j2me
 
А в int'e за альфа канал первый или четвёртый байт отвечает?
Я думаю может этот альфа канал использовать как з-буфер.
А то лишняя запись в массив много фпс забирает.

MiXaeL 29.06.2009 19:35

Ответ: создание 3Д движка на j2me
 
8 бит для z-буфера - это катастрофически мало. Даже не пытайся.

jimon 29.06.2009 19:37

Ответ: создание 3Д движка на j2me
 
WISHMASTER35
для Z буфера надо минимум 16 бит, но желательно 24 бита

тебе не кажется что если до тебя этого не сделали, то это технически почти не реализуемо ?
для быстрой 3д графики просто необходим векторный процессор - графический ускоритель

WISHMASTER35 29.06.2009 19:51

Ответ: создание 3Д движка на j2me
 
Вычислять расстояние для каждого пикселя я не буду. У меня сейчас не з-буфер, а f-buffer (frame buffer) в этот массив записуется номер кадра в котором был задан цвет пикселю. Этот массив у меня сейчас из байт, так, что 8 бит хватает.
Не факт, что до меня чего-то из моих идей не реализовывал кто-то другой. Не все ж движки с открытым исходным кодом.
Я вообще делаю движок для мобильного, поетому мне приходится придумывать, что-то что проще и быстрее, чем в комповских движках.
Хочется сделать движок как в контр тероризм-2. Кстати, в той игре псевдо 3д или 3д? По-моему, если в той игре, есть модели компов, вертолётов и др, то псевдо это уже не может быть.


Часовой пояс GMT +4, время: 04:42.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot