BlackShark писал(а):А откуда твоя сцена грузится? Из модели, или на лету генерируешь?
И так и эдак .
1 Есть самая первая самоделка читает модели в старом текстовом формате ASC (3DS for Dos)
(Начинал еще "каркасного" софт рендера )
Без первичного парсера совсем простая штука
Код: Выделить всё
//Прорисовка модели OpenGL
procedure OGL_DrawASC (DX_,DY_,DZ_:Single);
Var
A,b,c,AB,BC,CA,LI:LongInt;
Var
SaCol:integer;
cube_rotation: GLFloat;
Speed: Double;
CK:real;
begin
//Показ модели
for LI:=0 to sl.count-1 do
begin
Sscanf(sl[LI],'A:%d B:%d C:%d AB:%d BC:%d CA:%d' ,
[@A,@B,@C,@AB,@BC,@CA]);
glBegin(GL_TRIANGLES );
CK:=RANDOM(50)/100;
glColor3f(m_rgb.r-ck,m_rgb.g-ck,m_rgb.b-ck);
With Getv(A) do glVertex3f(DX_+x/100,DY_+y/100,DZ_+z/100);
With Getv(b) do glVertex3f(DX_+x/100,DY_+y/100,DZ_+z/100);
With Getv(c) do glVertex3f(DX_+x/100,DY_+y/100,DZ_+z/100);
glEnd();
end;
end;
Есть вариант с дисплейным списком
2 Самоделка 2 "Псевдо схема от ХайАсма" Идея и данные из примера к хайасму реализация моя.
Тоже "двойного действия" вариант с дисплейным списком основной "режим мерцания" дополнительный
3 Загрузка модели ОВJ ( Самоделка но не моя и чуть урезанная взята тут
http://www.sulaco.co.za//opengl_project ... loader.htm )
4 Плоский "Виртуальный экран" 1-2 полностью моя поделка (Частью честно выдрана из моих же прежних проектов)
5 "Фоновая сфера"(для панорам 360*) она же "полусферический экран" довольно примитивная штука : построение сетчатой сферы в полярных координатах с текстурой . (опять же прячу в ветхозаветный "дисплейный список" )
Код: Выделить всё
// Function to Create a sphere
//----------------------------------
procedure CreateSphere(CX, CY, CZ, Radius : glFloat;
N: Integer; NDX, NDY:Single; var SphereDL:GlInt;Const SBS_F:byte=0);
// N = precision
var I, J ,N2: Integer;
F1,f2,theta1,theta2,theta3 : glFloat;
X, Y, Z, px, py, pz : glFloat;
begin
SphereDL :=glGenLists(1);
glNewList(SphereDL, GL_COMPILE);
if Radius < 0 then Radius :=-Radius;
if n < 0 then n := -n;
if (n < 4) OR (Radius <= 0) then
begin
glBegin(GL_POINTS);
glVertex3f(CX, CY, CZ);
glEnd();
exit;
end;
for J :=0 to N DIV 2 -1 do
begin
theta1 := (J*2*PI/N - PI/2) /ndy;
theta2 := ((J+1)*2*PI/n - PI/2) /ndy;;
glBegin(GL_QUAD_STRIP);
For I :=N downto 0 do
begin
theta3 := (i*2*PI/N)/NDX;
x := cos(theta2) * cos(theta3);
y := sin(theta2);
z := cos(theta2) * sin(theta3);
px := CX + Radius*x;
py := CY + Radius*y;
pz := CZ + Radius*z;
// glNormal3f(X, Y, Z);
Case SBS_F of
0:F1:=1-I/n;
1:F1:=(1-I/n)/2;
2:F1:=0.5+(1-I/n)/2;
end;
glTexCoord2f(f1, 2*(J+1)/n);
glVertex3f(px,py,pz);
X := cos(theta1) * cos(theta3);
Y := sin(theta1);
Z := cos(theta1) * sin(theta3);
px := CX + Radius*X;
py := CY + Radius*Y;
pz := CZ + Radius*Z;
// glNormal3f(X, Y, Z);
glTexCoord2f(F1, 2*j/n);
glVertex3f(px,py,pz);
end;
glEnd();
end;
glEndList();
end;
6 Сейчас пилю что-то вроде "примитивного" всех смыслах редактора (пока работает только сфера и куб но их можно "плющить" и вращать )
7 Ко всему этому безобразию (довольно криво ) прикручено управление от какой-то загадочной демки "с танком".
(Было лениво изобретать изобретать "совсем велосипед" для одноразового использования )
Добавлено спустя 17 минут 26 секунд:BlackShark писал(а):Честно, вникать в VR пока времени нет. Если подскажешь что и куда воткнуть, то без проблем.
Хорошо попробую подготовить "пустую платформу" . Но у меня там есть непонятка с библиотекой glfw3.dll (толку от от нее ноль но без нее
InitRenderer не загружает шейдеры в которых я совершенно не разбираюсь, а выкинуть полностью не получается )
Так что на старте там вот такая кривуля стоит .
Код: Выделить всё
program Select_SHA;
{$mode objfpc}{$H+}
//{$APPTYPE GUI}
{$APPTYPE CONSOLE}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, lazopenglcontext, GL, GLExt, glu, GLFW31, Renderer, vr, Unit1, Unit6,
ET_utils, Coll_OBJ_add_Un_01;
{ you can add units after this }
{$R *.res}
Var
Window0: PGLFWwindow;
procedure InitWindow;
begin
if glfwInit = 0 then
begin
Writeln('Cannot init GLFW!');
Halt;
end;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
Window0 := glfwCreateWindow(WIDTH, HEIGHT, 'OpenVR', nil, nil);
if Window0 = nil then
begin
Writeln('Cannot create GLFW window!');
Halt;
end;
glfwMakeContextCurrent(Window0);
// glfwSetKeyCallback(Window, @HandleKey);
glfwSwapInterval(1);
if not Load_GL_version_4_3_CORE then
begin
Writeln('OpenGL 4.3 is required!');
Halt;
end;
end;
procedure FreeWindow;
begin
glfwDestroyWindow(Window0);
glfwTerminate;
end;
begin
InitWindow;
InitRenderer;
FreeWindow;
RequireDerivedFormResource:=True;
Application.Scaled:=True;
Application.Initialize;
Application.CreateForm(TMForm, MForm);
Application.CreateForm(TCaptureForm, CaptureForm);
Application.CreateForm(TET_Form, ET_Form);
Application.CreateForm(TFC_ObJ_Add, FC_ObJ_Add);
Application.Run;
end.