|
простой и красивый 3d-тетраэдр
| |
turkeevm | Дата: Четверг, 21.08.2008, 01:18 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 8
Статус: Offline
| Написал ради интереса простенький набор функций для 3d графики, и решил проверить на Мидлет Паскале. Все работает. Как на эмуле, так и на старом добром Motorola C380. Вот исходник Code program Simple3d;
type T3dPoint=record x,y,z:real; end; T2dPoint=record x,y:real; end;
var fx,fy,fz:real;
function Round(x:real):integer; begin Round:=Trunc(x); if ((Trunc(x)+0.5)<x) then Round:=Trunc(x)+1; end;
function GetScreenProection(P:T3dPoint):T2dPoint; var buf:T2dPoint; begin buf.x:=fx-fz*(P.x-fx)/(P.z-fz); buf.y:=fy-fz*(P.y-fy)/(P.z-fz); GetScreenProection:=buf; end;
procedure ClearDevice; begin SetColor(0,0,0); FillRect(0,0,GetWidth,GetHeight); end;
procedure Line(A,B:T2dPoint); begin DrawLine(Round(A.x), Round(A.y), Round(B.x), Round(B.y)); end;
procedure Line3d(A,B:T3dPoint); begin Line(GetScreenProection(A), GetScreenProection(B)); end;
function Rotation(X,O:T3dPoint; alpha, beta:real):T3dPoint; var vector:T3dPoint; buf:T3dPoint; begin vector.x:=X.x-O.x; vector.y:=X.y-O.y; vector.z:=X.z-O.z; buf.x:=O.x+cos(alpha)*vector.x+sin(alpha)*vector.z; buf.y:=O.y+vector.y; buf.z:=O.z-sin(alpha)*vector.x+cos(alpha)*vector.z;
vector.x:=buf.x-O.x; vector.y:=buf.y-O.y; vector.z:=buf.z-O.z;
buf.x:=O.x+vector.x; buf.y:=O.y+cos(beta)*vector.y-sin(beta)*vector.z; buf.z:=O.z+sin(beta)*vector.y+cos(beta)*vector.z; Rotation:=buf; end;
const pause=50;
var x_angle, y_angle:real; i,j:integer; A,B,C,D,O:T3dPoint;
begin x_angle:=Pi/30; y_angle:=-Pi/40; O.x:=GetWidth div 2; O.y:=GetHeight div 2; O.z:=60; fx:=O.x; fy:=O.y; fz:=-800; A.x:=O.x; A.y:=O.y-50; A.z:=O.z; B.x:=O.x-41; B.y:=O.y+17; B.z:=O.z-28; C.x:=O.y+41; C.y:=O.y+17; C.z:=O.z-28; D.x:=O.x; D.y:=O.y+17; D.z:=O.z+56; repeat ClearDevice; // SetColor(255,0,0); // Line3d(O,A); // Line3d(O,B); // Line3d(O,C); // Line3d(O,D); SetColor(0,255,0); Line3d(A,B); Line3d(A,C); Line3d(A,D); Line3d(B,C); Line3d(C,D); Line3d(D,B); A:=Rotation(A,O,x_angle,y_angle); B:=Rotation(B,O,x_angle,y_angle); C:=Rotation(C,O,x_angle,y_angle); D:=Rotation(D,O,x_angle,y_angle); Repaint; Delay(pause); until false; end.
Сообщение отредактировал turkeevm - Четверг, 21.08.2008, 01:20 |
|
| |
Ivin | Дата: Понедельник, 01.09.2008, 19:09 | Сообщение # 2 |
Admin
Группа: Администраторы
Сообщений: 46
Статус: Offline
| turkeevm, очень мне твой алгоритм напоминает точно такой же из книги "Занимательное программирование". Не знаешь почему?
|
|
| |
turkeevm | Дата: Четверг, 04.09.2008, 14:54 | Сообщение # 3 |
Рядовой
Группа: Пользователи
Сообщений: 8
Статус: Offline
| Понятия не имею. Я придумал первую его часть сам еще в девятом классе не могу сказать, что это было просто (проекция 3d точки на плоскость). А вторую придумал уже в универе. Чистая линейная алгебра. Там просчитываются две матрицы поворота. А про такую книжку впервые слышу. Если все еще не веришь, могу рассказать как работает каждая строка кода.
|
|
| |
ger1234567 | Дата: Суббота, 06.09.2008, 16:11 | Сообщение # 4 |
Рядовой
Группа: Проверенные
Сообщений: 7
Статус: Offline
| Прикольно но Mascot Capsule 3D Лучше и прощще!
|
|
| |
Ivin | Дата: Суббота, 06.09.2008, 19:04 | Сообщение # 5 |
Admin
Группа: Администраторы
Сообщений: 46
Статус: Offline
| turkeevm, да это элементарно. Даже впервые увидев этот код любой человек немного знающий математику и программирование без труда опишет каждую строчку. Все это действительно почти везде описывается примерно так же, и вполне вероятно что ты это написал сам, просто похоже очень сильно, вот я и спросил. ЗЫ а почему не полигоны?
|
|
| |
turkeevm | Дата: Понедельник, 08.09.2008, 11:12 | Сообщение # 6 |
Рядовой
Группа: Пользователи
Сообщений: 8
Статус: Offline
| Quote (Ivin) ЗЫ а почему не полигоны? Вообще-то это я зря сказал, что оно очень хорошо работает на телефоне. На самом деле оно слегка тормозит. Видно синусы очень уж емкая штука. В смысле времени кушают много. Так что какие уж тут полигоны. Хотя если речь идет о статичной каринке, то можно и помучиться. Quote (ger1234567) Прикольно но Mascot Capsule 3D Лучше и прощще! Соль в том, что хотелось написать самому что-нибудь эдакое... не для пользы дела, а для собственного удовлетворения.
Сообщение отредактировал turkeevm - Понедельник, 08.09.2008, 11:19 |
|
| |
Ivin | Дата: Вторник, 09.09.2008, 08:38 | Сообщение # 7 |
Admin
Группа: Администраторы
Сообщений: 46
Статус: Offline
| turkeevm, можно синусы/косинусы заменить массивом значений, так быстрее работает, но немного кривоватее и нужно переходить на градусы. Примерно так SinMas(round(alphf*180)); - по моему будет работать быстре чем просто синус.
|
|
| |
turkeevm | Дата: Вторник, 09.09.2008, 14:22 | Сообщение # 8 |
Рядовой
Группа: Пользователи
Сообщений: 8
Статус: Offline
| Вообще я думал о том, чтобы попробовать формулу Тейлора, но с маленькой точностью. Для небольших углов может и прокатит. Добавлено (09.09.2008, 14:22) --------------------------------------------- В общем вставил ЭТО: Code function TlrSin(x:real):real; begin TlrSin:=x*(1-0.6667*sqr(x)*(1-0.05*sqr(x))); end;
function TlrCos(x:real):real; begin TlrCos:=1-0.5*sqr(x)*(1-0.08333*sqr(x)*(1-0.03333*sqr(x))); end; стало быстрее, но точность... просто отвратительно
|
|
| |
Ivin | Дата: Вторник, 09.09.2008, 17:32 | Сообщение # 9 |
Admin
Группа: Администраторы
Сообщений: 46
Статус: Offline
| Quote (turkeevm) попробовать формулу Тейлора , меня от одного этого имени в дрож бросает Quote (turkeevm) стало быстрее, но точность... просто отвратительно Она не правильно работает, во всяком случае обычный кружок нарисовать не вышло: Code for r:=1 to round(pi*2*90) do begin y:=100+TlrCos(r/90)*50; x:=100+TlrSin(r/90)*50; form1.Canvas.Ellipse(round(x)-4,round(y)-4,round(x)+4,round(y)+4); end; ЗЫ Это Делфи.
|
|
| |
turkeevm | Дата: Понедельник, 15.09.2008, 14:45 | Сообщение # 10 |
Рядовой
Группа: Пользователи
Сообщений: 8
Статус: Offline
| Я ж говорю только для маленьких углов. Тоесть где-то от -Pi/3 до Pi/3 если не меньше А в моей проге поворот вообще постоянный на Pi/30 и на Pi/40
Сообщение отредактировал turkeevm - Понедельник, 15.09.2008, 14:47 |
|
| |
ger1234567 | Дата: Четверг, 25.09.2008, 16:19 | Сообщение # 11 |
Рядовой
Группа: Проверенные
Сообщений: 7
Статус: Offline
| чуваки говорите тормозит попробуйте Mascot Capsule 3D вот оно не тормозит
|
|
| |
turkeevm | Дата: Среда, 15.10.2008, 00:40 | Сообщение # 12 |
Рядовой
Группа: Пользователи
Сообщений: 8
Статус: Offline
| Ну что ты блин пристал со своим Mascot! Знашь сколько он памяти хавает! Да на Motorola C380 он в жизни не запустится. Кроме того исходники есть только на java а я ее не знаю. Вот.
|
|
| |
ger1234567 | Дата: Пятница, 17.10.2008, 16:07 | Сообщение # 13 |
Рядовой
Группа: Проверенные
Сообщений: 7
Статус: Offline
| он ок работает только на телефонах Nokia Sony Ericsson а все остальное отстой на том не умеет на том не поддержует у меня Sony ericsson K750i даже не виснет на 3d гре Reilly master pro если ты слыхал о такой если хочеш знать про Mascot Capsule 3D это в формате M3g фирма Mascot подробная информация на developer.sonyericsson.com там усе найдеш и еще M3g можно создавать в 3ds max , milk shape , и другие.
|
|
| |
|