forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Математика (http://forum.boolean.name/forumdisplay.php?f=85)
-   -   Проекция 3D (http://forum.boolean.name/showthread.php?t=14985)

RegIon 25.06.2011 10:35

Проекция 3D
 
Я никак не могу догнать как сделать математическую проекцию 3D на экран (openGL помине нет).
Вот для примера дайте код(желательно на С) для отрисовки примитивного куба(хотя б только вертиклы с триангалами),причем более-менее быстрый-качественный...(макс разрешение 480*272).
(можно примерный полный код с отрисовкой сразу в буфер)

pax 25.06.2011 14:27

Ответ: Проекция 3D
 
Копай irrlicht, в нем софтверный рендер есть.

Mr_F_ 25.06.2011 14:34

Ответ: Проекция 3D
 
http://www.codeguru.com/cpp/misc/mis...cle.php/c10123

RegIon 25.06.2011 14:41

Ответ: Проекция 3D
 
Цитата:

Копай irrlicht, в нем софтверный рендер есть.
не могу,так как платформа портативная,а есть ли в нем 3д сопроцессор-ХЗ,в доках вроде есть(хз как квак и дум портировали....)

RegIon 25.06.2011 15:00

Ответ: Проекция 3D
 
http://pmg.org.ru/basic3d/math.htm --разжеванно

YellowAfterlife 25.06.2011 15:10

Ответ: Проекция 3D
 
Преобразование 3d координат точки в 2d координаты на экране.
Пример на п̶с̶е̶в̶д̶о̶к̶о̶д̶е GameMaker:

Функция задания проэкции (вызывать при смене позиции камеры):
Код:

/* argument[] - массив переданных в функцию параметров
P.S.: практически все переменные из этой функции должны быть глобальными */
/*
0..2 координаты источника камеры (откуда смотрит)
3..5 координаты цели камеры (куда смотрит)
6..8 вектор "нормали" камеры (можно просто поставить 0,0,1)
*/
/*
    p3d_set_projection(
    0  xFrom
    1  yFrom
    2  zFrom
    3  xTo
    4  yTo
    5  zTo
    6  xUp
    7  yUp
    8  zUp
    9  arc = 60
    A  view = 0
    )
*/
_sx = argument[0]
_sy = argument[1]
_sz = argument[2]
_sw = view_wview[argument[10]] /* ширина экрана */
_sh = view_hview[argument[10]] /* высота экрана */
_sa = _sw / _sh
// delta:
_dx = argument[3] - _sx
_dy = argument[4] - _sy
_dz = argument[5] - _sz
// delta vector length:
_dl = sqrt(_dx * _dx + _dy * _dy + _dz * _dz)
// divide by length to get 1-long vector:
_dx /= _dl
_dy /= _dl
_dz /= _dl
// xyzUp:
_nx = argument[6]
_ny = argument[7]
_nz = argument[8]
//
_nn = _dx * _nx + _dy * _ny + _dz * _nz
// subtract from xyzUp:
_nx -= _dx * _nn
_ny -= _dy * _nn
_nz -= _dz * _nn
// xyzUp length:
_nl = sqrt(_nx * _nx + _ny * _ny + _nz * _nz)
_am = tan(argument[9] * pi / 360)
//
_nx *= _am / _nl
_ny *= _am / _nl
_nz *= _am / _nl
//
_vx = (_dz * _ny - _dy * _nz) * _sa
_vy = (_dx * _nz - _dz * _nx) * _sa
_vz = (_dy * _nx - _dx * _ny) * _sa


Преобразование координат:
Код:

/* px, py - глобальные переменные. можно заменить на возврат структуры Point {x, y }*/
/*
    p3d_vertex(offset, x, y, z)
*/
var tx, ty, tz, tl, tt, ti;
ti = argument[0]
tx = argument[1] - _sx
ty = argument[2] - _sy
tz = argument[3] - _sz
tl = tx * _dx + ty * _dy + tz * _dz
//
tx /= tl
ty /= tl
tz /= tl
//
tt = (tx * _vx + ty * _vy + tz * _vz) / sqr(_sa * tan(pi / 8))
px[ti] = (tt + 1) * _sw / 2
tt = (tx * _nx + ty * _ny + tz * _nz) / sqr(tan(pi / 8))
py[ti] = (1 - tt) * _sh / 2


Для рисования, используем вторую функцию для занесения преобразованных координат точки в массив, и потом рисуем это как-либо:
Код:

p3d_vertex(0, 0, 0, 0)
p3d_vertex(1, 256, 0, 0)
p3d_vertex(3, 0, 256, 0)
p3d_vertex(2, 256, 256, 0)
for (i = 0; i < 4; i += 1)
draw_line(px[i], py[i], px[(i + 1) mod 4], py[(i + 1) mod 4])



Отредактировано: кажется, я зря писал это сообщение и добавлял комментарии в код.
(по крайней мере я пытался помочь)

pax 25.06.2011 15:20

Ответ: Проекция 3D
 
http://en.wikipedia.org/wiki/Software_rendering смотреть ссылки

RegIon 25.06.2011 15:55

Ответ: Проекция 3D
 
ок..YellowAfterlife-и тебе спс.(тока косяк ОГРОМНЫЙ,не знаю как в буфер точку поставить,а то через dawrect вериДОЛГО)

Mr_F_ 25.06.2011 15:56

Ответ: Проекция 3D
 
Цитата:

так как платформа портативная,а есть ли в нем 3д сопроцессор-ХЗ,
о_0 чего

RegIon 26.06.2011 06:07

Ответ: Проекция 3D
 
Цитата:

о_0 чего
просто забыл как называется,gpu хз есть-нет,вроде есть,но какой-то линейный рендр

RegIon 26.06.2011 07:35

Ответ: Проекция 3D
 
позырил ирлич-так-тот гуд,но он в ОС нуждается в длл'ке,а у меня процессор ARM на архе ceva...ни о каких либах речи и не может быть

Randomize 26.06.2011 10:11

Ответ: Проекция 3D
 
Цитата:

Сообщение от Костян (Сообщение 193157)
позырил ирлич-так-тот гуд,но он в ОС нуждается в длл'ке,а у меня процессор ARM на архе ceva...ни о каких либах речи и не может быть

Чего? Ирлич? В ОС нуждается? Процессор ARM на архе ceva? Опять люфт?

RegIon 26.06.2011 10:19

Ответ: Проекция 3D
 
Цитата:

Чего? Ирлич? В ОС нуждается? Процессор ARM на архе ceva? Опять люфт?
irrlicht. В Операционной системе чтоб программы работали сбилденые им нужна длл irrlicht.dll..Да,arm на севе(spmp8000 серии) ~300мгц,32мб озу(макс 128,хочу напаять 64)

Android 26.06.2011 14:54

Ответ: Проекция 3D
 
Цитата:

spmp8000
LetCool N350JP? Или какой-нибудь дефендер? Они тоже вроде клоны ЛетКула шлепали.

RegIon 27.06.2011 15:46

Ответ: Проекция 3D
 
Цитата:

LetCool N350JP? Или какой-нибудь дефендер? Они тоже вроде клоны ЛетКула шлепали.
нет,ни один. JXD1000-этот,железо почти одинаковое,но у этого экран 480*272 и он сам побольше


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

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