Вверх ↑
Этот топик читают: Гость
Ответов: 2057
Рейтинг: 28
#76: 2007-02-10 17:31:16 ЛС | профиль | цитата
Мне вот что непонятно - что должно в итоге получится? Копия 3DS макс?

ребята что тут не понятного я не пойму? Компоненту будет даваться Хандле окна для отресоовки и он будет на ней отресововать модель. Хотя и без этого может быть обойдется. Компонент для начало не будет делать не каких дополнительных действий. Только отображать модель. Для поворота модели, масштабирования - есть куча других компонентов. Загляните в Exsample.
code_966 В этом коде образно говоря вместо компонента Gl_Text будет стоять GL_3dsMax.
карма: 1

0
файлы: 1code_966.txt [6.5KB] [592]
Разработчик
Ответов: 26061
Рейтинг: 2120
#77: 2007-02-10 17:40:19 ЛС | профиль | цитата
Эдик, опять ты меня не понял. Спрашиваю более точно -- какие данные и в каком формате необходимы на выходе компонента (текст комманд и данных, hex-стрим, BMP и тд и тп)?
карма: 22

0
Ответов: 2057
Рейтинг: 28
#78: 2007-02-10 18:22:30 ЛС | профиль | цитата
nesco, по моему я тебя действительно что то не понемаю. Зачем нужны какие то данные на выходе компонента? На выходе компонента могут быть только данные такого характера:
0 - Компонент не смог загрузить файл *.3ds с жесткого диска.
1- Компонент удачно загрузил модель *.3ds с жеского диска в память компьютора.

Файл *.3ds будет загружаться компонентом GL_3dsMax в память компьютора и от туда по не обходимости будет отресовываться на экране. Не каких BMP и Gif и JPG тут пока не будет использоваться. Все полегоны, все вершины записанны в *.3ds.
Если я опять не понял, то спрашивай.

[size=-2]------ Добавлено в 18:22
nesco, может ты вот этого не можешь понять?
Add(MainForm,15261923,-77,70)
{
Left=20
Top=105
Width=581
Height=580
Point(MouseX)
Point(MouseY)
link(onResize,3213527:doWork1,[(74,104)])
link(onCreate,16299401:doEvent1,[(-15,111)(-15,160)])
}
Add(GL_Main,12986311,91,154)
{
link(onInit,14983200:doData,[(133,160)(133,121)(90,121)(90,62)])
link(onViewPort,3410847:doPerspective,[(131,167)(131,202)])
link(Handle,15261923:Handle,[(97,127)(-71,127)])
}
Add(Timer,9506849,-49,252)
{
Interval=33
Enable=1
link(onTimer,1049454:doEvent1,[])
}
Add(GL_GTools,771925,56,252)
{
Point(doClear)
Point(doPushMatrix)
Point(doPopMatrix)
}
Add(GL_GluTools,4593655,357,154)
{
DrawStyle=1
link(onInit,13892984:doData,[(409,160)(409,83)])
}
Add(Hub,1049454,0,252)
{
OutCount=5
link(onEvent1,771925:doClear,[])
link(onEvent2,771925:doPushMatrix,[])
link(onEvent3,1729843:doNext,[(89,272)(89,272)])
link(onEvent4,771925:doPopMatrix,[(48,279)(48,272)])
link(onEvent5,12986311:doFlip,[(53,286)(53,174)])
}
Add(Hub,16299401,-7,154)
{
OutCount=3
link(onEvent1,12986311:doInit,[])
link(onEvent2,3213527:doWork2,[])
link(onEvent3,9506849:doTimer,[(39,174)(39,219)(-55,219)(-55,258)])
}
Add(MultiElement,10714674,224,266)
{
link(onEvent1,6162210:doWork1,[])
link(Data1,14771766:Value,[])
link(Data2,6043289:Value,[(237,247)(286,247)])
}
BEGIN_SDK
Add(EditMulti,4359962,3,3)
{
EventCount=1
WorkCount=1
DataCount=2
Width=181
Height=109
link(doWork1,3276760:doRotate,[(19,9)(19,55)])
}
Add(GL_Rotate,3276760,35,49)
{
Y=1
link(onRotate,8079493:doRotate,[])
link(Angle,4359962:Data1,[(41,26)(9,26)])
}
Add(GL_Rotate,8079493,112,49)
{
X=1
link(onRotate,4359962:onEvent1,[(160,55)(160,9)])
link(Angle,4359962:Data2,[(118,16)(16,16)])
}
END_SDK
Add(HubEx,3213527,70,154)
{
link(onEvent,12986311:doViewPort,[])
}
Add(Gl_Translate,6434525,448,266)
{
Y=-0.2
link(onTranslate,8759509:doNext,[])
}
Add(Gl_Text,3060881,154,154)
{
Depth=0.2
Font=[Times New Roman,5,0,32768,1]
Text="HiAsm"
link(onInit,919766:doData,[(196,160)(196,128)(160,128)(160,76)])
link(GLHandle,12986311:GLHandle,[(160,144)(139,144)(139,196)(97,196)])
}
Add(MultiElement,6162210,280,266)
{
link(onEvent1,1731160:doWork1,[])
}
BEGIN_SDK
Add(EditMulti,13416492,3,3)
{
EventCount=1
WorkCount=1
Width=468
Height=137
link(doWork1,11196606:doPushMatrix,[(29,9)(29,76)])
}
Add(GL_Sphere,12678019,357,70)
{
Radius=0.05
Slices=10
link(onDraw,16242413:doPopMatrix,[])
}
Add(Gl_Translate,6506827,308,70)
{
Z=1.5
link(onTranslate,12678019:doDraw,[])
}
Add(GL_Rotate,15834536,259,70)
{
X=1
link(onRotate,6506827:doTranslate,[])
}
Add(GL_GTools,11196606,49,70)
{
Point(doPushMatrix)
link(onEvent,4975387:doDraw,[])
}
Add(GL_GTools,16242413,413,70)
{
Point(doPopMatrix)
link(onEvent,13416492:onEvent1,[(454,76)(454,9)])
}
Add(Counter,13547329,210,70)
{
Max=360
Step=3
link(onNext,15834536:doRotate,[])
}
Add(GL_Disk,4975387,98,70)
{
InRadius=1.49
OutRadius=1.5
Slices=30
Stacks=1
link(onDraw,305284:doRotate,[])
}
Add(GL_Rotate,305284,154,70)
{
Angle=90
Y=1
link(onRotate,13547329:doNext,[])
}
END_SDK
Add(MultiElement,1731160,336,266)
{
link(onEvent1,6435113:doWork1,[])
}
BEGIN_SDK
Add(EditMulti,13416492,3,3)
{
EventCount=1
WorkCount=1
Width=482
Height=151
link(doWork1,11196606:doPushMatrix,[(26,9)(26,83)])
}
Add(GL_Sphere,12678019,378,77)
{
Radius=0.05
Slices=10
link(onDraw,16242413:doPopMatrix,[])
}
Add(Gl_Translate,6506827,329,77)
{
Z=1.5
link(onTranslate,12678019:doDraw,[])
}
Add(GL_Rotate,15834536,280,77)
{
X=1
link(onRotate,6506827:doTranslate,[])
}
Add(GL_GTools,11196606,35,77)
{
Point(doPushMatrix)
link(onEvent,5771332:doRotate,[])
}
Add(GL_GTools,16242413,434,77)
{
Point(doPopMatrix)
link(onEvent,13416492:onEvent1,[(475,83)(475,9)])
}
Add(Counter,13547329,231,77)
{
Max=360
Step=3
Default=120
link(onNext,15834536:doRotate,[])
}
Add(GL_Rotate,5771332,84,77)
{
Angle=120
Y=1
link(onRotate,4975387:doDraw,[])
}
Add(GL_Disk,4975387,126,77)
{
InRadius=1.49
OutRadius=1.5
Slices=30
Stacks=1
link(onDraw,8300552:doRotate,[])
}
Add(GL_Rotate,8300552,175,77)
{
Angle=90
Y=1
link(onRotate,13547329:doNext,[])
}
END_SDK
Add(MultiElement,6435113,392,266)
{
link(onEvent1,6434525:doTranslate,[])
}
BEGIN_SDK
Add(EditMulti,13416492,3,3)
{
EventCount=1
WorkCount=1
Width=510
Height=172
link(doWork1,11196606:doPushMatrix,[(26,9)(26,83)])
}
Add(GL_Sphere,12678019,385,77)
{
Radius=0.05
Slices=10
link(onDraw,16242413:doPopMatrix,[])
}
Add(Gl_Translate,6506827,336,77)
{
Z=1.5
link(onTranslate,12678019:doDraw,[])
}
Add(GL_Rotate,15834536,287,77)
{
X=1
link(onRotate,6506827:doTranslate,[])
}
Add(GL_GTools,11196606,35,77)
{
Point(doPushMatrix)
link(onEvent,5771332:doRotate,[])
}
Add(GL_GTools,16242413,441,77)
{
Point(doPopMatrix)
link(onEvent,13416492:onEvent1,[(482,83)(482,9)])
}
Add(Counter,13547329,238,77)
{
Max=360
Step=3
Default=240
link(onNext,15834536:doRotate,[])
}
Add(GL_Rotate,5771332,84,77)
{
Angle=240
Y=1
link(onRotate,4975387:doDraw,[])
}
Add(GL_Disk,4975387,140,77)
{
InRadius=1.49
OutRadius=1.5
Slices=30
Stacks=1
link(onDraw,305284:doRotate,[])
}
Add(GL_Rotate,305284,189,77)
{
Angle=90
Y=1
link(onRotate,13547329:doNext,[])
}
END_SDK
Add(Counter,8759509,504,266)
{
Max=360
Step=2
link(onNext,98498:doRotate,[])
}
Add(GL_Rotate,98498,553,266)
{
Y=1
link(onRotate,4529241:doData,[(595,272)(595,317)(566,317)(566,342)])
}
Add(GL_Rotate,16361112,161,266)
{
X=1
Y=1
Z=1
link(onRotate,11517321:doData,[(203,272)(203,324)(174,324)(174,356)])
}
Add(Gl_Translate,4101734,609,266)
{
X=-1.3
Z=0.1
link(onTranslate,3060881:doDraw,[(661,272)(661,240)(144,240)(144,167)])
}
Add(Memory,14771766,224,196)
{
Default=Integer(358)
}
Add(Memory,6043289,280,196)
{
Default=Integer(412)
}
Add(Counter,1729843,112,266)
{
Max=360
link(onNext,16361112:doRotate,[])
}
Add(GL_Light,6976573,490,154)
{
}
Add(GL_Options,16663485,203,154)
{
Flag=2
link(onEvent,14176651:doData,[(245,160)(245,132)(223,132)(223,83)])
}
Add(GL_Options,1571481,259,154)
{
link(onEvent,2143035:doData,[(293,160)(293,83)])
}
Add(GL_Options,15984634,308,154)
{
Flag=1
link(onEvent,7152172:doData,[(349,160)(349,83)])
}
Add(GL_Perspective,3410847,154,196)
{
Fovy=30
}
Add(DoData,11517321,184,350)
{
link(onEventData,10714674:doWork1,[(220,356)(220,272)])
}
Add(DoData,4529241,576,336)
{
link(onEventData,4101734:doTranslate,[(618,342)(618,317)(599,317)(599,272)])
}
Add(DoData,14176651,233,77)
{
link(onEventData,1571481:doEnabled,[(275,83)(275,131)(249,131)(249,160)])
}
Add(DoData,2143035,296,77)
{
link(onEventData,15984634:doEnabled,[(338,83)(338,131)(298,131)(298,160)])
}
Add(DoData,7152172,359,77)
{
link(onEventData,4593655:doInit,[(401,83)(401,131)(347,131)(347,160)])
}
Add(DoData,13892984,429,77)
{
link(onEventData,6976573:doEnabled,[(475,83)(475,160)])
}
Add(DoData,919766,170,70)
{
link(onEventData,16663485:doEnabled,[(212,76)(212,128)(193,128)(193,160)])
}
Add(DoData,14983200,100,56)
{
link(onEventData,3060881:doInit,[(143,62)(143,160)])
}
карма: 1

0
Ответов: 963
Рейтинг: 12
#79: 2007-02-10 19:34:27 ЛС | профиль | цитата
Ну и зачем пример сюда кидать ?

[size=-2]------ Добавлено в 19:27
Эдик писал(а):
AlexKir, 1. Ты можешь оставить тут полученные коды?
2. Можешь оставить ссылку на программу конвертор?


Конвертор тут !
http://krazz.net/retnyg/kolconv.htm

Код к сожалению похоже стер вместе с распакованным конвертором .


карма: 0

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#80: 2007-02-10 20:30:40 ЛС | профиль | цитата
Эдик, скажи -- внутри KOL'ов, которые ты дал есть ли функции отрисовки 3d моделей, или там только методы доступа к параметрам модели. Я посмотрел параметры фалов 3ds, там не один только текст, а куча текстур. Как их выводить на экран, какими методами?
карма: 22

0
Ответов: 2057
Рейтинг: 28
#81: 2007-02-10 22:17:57 ЛС | профиль | цитата
nesco, вот эту процедуру из (Viewer.pas)
procedure TViewerForm.Use3DSData(const Reader: TFile3DS);

похоже придёться переносить в наш компонент.
nesco писал(а):
Эдик, скажи -- внутри KOL'ов, которые ты дал есть ли функции отрисовки 3d моделей, или там только методы доступа к параметрам модели. Я посмотрел параметры фалов 3ds, там не один только текст, а куча текстур. Как их выводить на экран, какими методами?

на счёт этого сежу разбераюсь. Вот взгляни на это

#pas
procedure TViewerForm.FormPaint(Sender: TObject);

// This is the main paint routine. If there's no data assigned yet then an empty window is drawn else the data stored
// in the various lists. These lists must already be set up.

var Scale: Single;

begin
// Note: We don't need to activate the rendering context here, as we did this in the OnShow event
// handler and we have setup the window to use a private DC (which is therefore never reset).
ClearBuffersAndBackground;

if FCameraChanged then
begin
FCameraChanged := False;
// set up projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
if NavPanel.Visible then
ApplyPerspective(FViewport, ClientWidth - NavPanel.Width, ClientHeight, FDPI)
else
ApplyPerspective(FViewport, Width, ClientHeight, FDPI);
end;

// initialize transformation pipeline
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;

// lights
Scale := ScaleUpDown.Position / 1000;
if FLightSourcesChanged then
begin
glScalef(Scale, Scale, Scale);
SetupLights;
glLoadIdentity;
end;

// camera
gluLookAt(0, 0, 50,
0, 0, -10,
0, 1, 0);

// objects
if Abs(1 - Scale) > 0.1 then
begin
glEnable(GL_NORMALIZE); // this will half the frame rate but is necessary for changing overall
// scale on the fly and still get the correct lighting
glScalef(Scale, Scale, Scale);
end
else glDisable(GL_NORMALIZE);
glMultMatrixf(@FSceneMatrix);
if FMainList <> 0 then glCallList(FMainList);

// copy back buffer to front
SwapBuffers(Canvas.Handle);
end;

[size=-2]------ Добавлено в 22:17
Если верхний код упрастить то он будет выглядить примерно так:

#pas
procedure THIGl_3dsMax._work_doDraw;
var Scale: Single;
begin

glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glMultMatrixf(@FSceneMatrix);
if FMainList <> 0 then glCallList(FMainList);
_hi_CreateEvent(_Data,@_event_onDraw);
end;
карма: 1

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#82: 2007-02-10 22:21:44 ЛС | профиль | цитата
Эдик, посмотри еще, все ли методы gl естьу нас в HiAsm'e.
карма: 22

0
Ответов: 2057
Рейтинг: 28
#83: 2007-02-10 22:32:46 ЛС | профиль | цитата
nesco, можешь уточнить просьбу? Что за методы gl? Мы же подключаем модуль OpenGL.pas само собой методы будут. Да и другие модули тоже же подключаем.

[size=-2]------ Добавлено в 22:32
К примеру вот это в HiAsm уже работает без вопросов.

#pas
procedure THIGl_3dsMax._work_doDraw;
var Scale: Single;
begin

glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glMultMatrixf(@FSceneMatrix);
if FMainList <> 0 then glCallList(FMainList);
_hi_CreateEvent(_Data,@_event_onDraw);
end;
карма: 1

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#84: 2007-02-10 22:56:47 ЛС | профиль | цитата
Эдик, что-то ты его лихо укусал? А куда все остальное подевалось? Откуда берутся FSceneMatrix и FMainList?

карма: 22

0
Ответов: 2057
Рейтинг: 28
#85: 2007-02-10 23:12:40 ЛС | профиль | цитата
nesco, всё это находеться в в процедуре
procedure TViewerForm.Use3DSData(const Reader: TFile3DS);

она как главный процессор. Всё подготавливает и заносит все данные об модели туда куда надо. И по моему нам остаёться только выполнить дисплейный список.

[size=-2]------ Добавлено в 23:12
nesco,
FCameraChanged := False;
// set up projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
if NavPanel.Visible then
ApplyPerspective(FViewport, ClientWidth - NavPanel.Width, ClientHeight, FDPI)
else
ApplyPerspective(FViewport, Width, ClientHeight, FDPI);
end;
это компонент GL_Perspective

#pas
Scale := ScaleUpDown.Position / 1000;
if FLightSourcesChanged then
begin
glScalef(Scale, Scale, Scale);
SetupLights;
glLoadIdentity;
end;
...
// objects
if Abs(1 - Scale) > 0.1 then
begin
glEnable(GL_NORMALIZE); // this will half the frame rate but is necessary for changing overall
// scale on the fly and still get the correct lighting
glScalef(Scale, Scale, Scale);
end
else glDisable(GL_NORMALIZE);
это компонет Gl_Scale

#pas
// camera
gluLookAt(0, 0, 50,
0, 0, -10,
0, 1, 0);
такой компонент тоже есть моего сопственного производства. Лежит в Уплоад. Но его можно вообще не использовать.
карма: 1

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#86: 2007-02-10 23:15:05 ЛС | профиль | цитата
Эдик писал(а):
К примеру вот это в HiAsm уже работает без вопросов.

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

0
Ответов: 2057
Рейтинг: 28
#87: 2007-02-10 23:41:46 ЛС | профиль | цитата
nesco писал(а):
И где все это находится, и в чем тогда проблема, непонятно? Если ты уже все это соорудил, то хоть кинь посмотреть со схемкой примером. Если не открывается файл, то я думаю это можно решить. Надо только в коде разобраться -- что откуда берется.

я тебе попробую разказать план действий. У меня есть начало компонента. Его надо доделать, а то фактически пока он ни чего не может сделать.
1. Нужно в нём сделать загрузку *.3ds файла.
2. Процедуру
procedure TViewerForm.Use3DSData(const Reader: TFile3DS);
нужно перенести в наш компонент.Если при компиляции компилятор что то попросит мы ему это будем довать.
3. Текстуры мы пока трогать не будем без нужной на это необходимости. Оставим их на потом.
карма: 1

0
файлы: 1Komponent.rar [76.4KB] [401]
Разработчик
Ответов: 26061
Рейтинг: 2120
#88: 2007-02-10 23:49:18 ЛС | профиль | цитата
Эдик, ага, понятно. В кратчайшее время попробую разобраться (спешка нужна... ну ты сам знаешь зачем). Так что, давай не торопить события, просто у меня есть небольшое задание по работе и надо его доделать.
PS: Плохо то, что все, что делается остается в Uploade и в среду не попадает. А разборки на форуме ведутся на штатных компонентах.
карма: 22

0
Ответов: 2057
Рейтинг: 28
#89: 2007-02-10 23:58:54 ЛС | профиль | цитата
nesco писал(а):
Так что, давай не торопить события, просто у меня есть небольшое задание по работе и надо его доделать.

Да я могу месяц подождать, если надо...
карма: 1

0
Разработчик
Ответов: 26061
Рейтинг: 2120
#90: 2007-02-11 00:15:06 ЛС | профиль | цитата
Эдик, ты мне лучше описание OpenGL найди с подробным описанием всех методов. Я сам кое-чего нашел, но этого катастрофически мало.
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)