|
3D-программирование Вопросы, касающиеся программирования 3D мира |
03.05.2009, 21:30
|
#1
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Поверткесная сборка.
Сам я не очень практивоался в сабже. Мне тербуется следующая функция.
вход Xs#,Ys#,Zs#
выход дескриптор меша
описание:
функция повертексно собирает кубик с размерами по осям:
xs - абсцисса
ys - ордината
zs - аппликата
центр меша в точке [x2/2;ys/2;zs/2].
Предусмотреть возможность (реализовать) 4ого аргумента,который овтечает за направление номралей меша (из_центра/в_центр). Это позволит делать параллелепипед видмый снраужи/внтури.
Заранее спасибо.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
03.05.2009, 22:22
|
#2
|
Бывалый
Регистрация: 10.06.2006
Сообщений: 808
Написано 354 полезных сообщений (для 832 пользователей)
|
Ответ: Поверткесная сборка.
;Segmented cube
Function CreateSegCube(xsegs=1,ysegs=1,zsegs=1,parent=0)
Return CreateCube()
mesh=CreateMesh(parent)
For i=1 To 4
AddCubeFace(mesh, ysegs, zsegs*(i=1 Or i=4)+xsegs*(i=2 Or i=3)):RotateMesh mesh, 0, i*90, 0
Next
RotateMesh mesh, 0, 0, -90
For i=0 To 1
AddCubeFace(mesh, xsegs, zsegs):RotateMesh mesh, 0, 0, (i=0)*180
Next
RotateMesh mesh, 0, 180, 90:UpdateNormals mesh:Return mesh
End Function
Function AddCubeFace(mesh, xsegs, ysegs)
surf=CreateSurface( mesh ):xstp# = 2.0 / Float(xsegs):ystp# = 2.0 / Float(ysegs):y#=-1.0
For a=0 To ysegs
x#=-1.0:u#=Float(a)/Float(ysegs)
For b=0 To xsegs
v#=Float(b)/Float(xsegs):AddVertex(surf,1,-x,y,-u,-v)
x = x + xstp
Next
y = y + ystp
Next
For a=0 To ysegs-1
For b=0 To xsegs-1
v0=a*(xsegs+1)+b:v1=v0+1:v2=(a+1)*(xsegs+1)+b+1:v3 =v2-1
AddTriangle( surf,v0,v2,v1 ):AddTriangle( surf,v0,v3,v2 )
Next
Next
End Function
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
04.05.2009, 10:52
|
#3
|
|
Ответ: Поверткесная сборка.
функция повертексно собирает кубик
|
Держи, "повертекснее" некуда
Function CreateCube2(xs#, ys#, zs#, parent% = 0, invert% = 0, multi% = 0)
Local cx#, cy#, cz#, mesh%, surf%, v1%, v2%, v3%, v4%
; вычисляем центр
cx = xs * 0.5
cy = ys * 0.5
cz = zs * 0.5
; создаем меш
mesh = CreateMesh(parent)
; создаем сурфейс
surf = CreateSurface(mesh)
; ---------------------------------
; нижняя грань
; ---------------------------------
v1 = AddVertex(surf, -cx, -cy, -cz, 0.0, 0.0)
v2 = AddVertex(surf, +cx, -cy, -cz, 1.0, 0.0)
v3 = AddVertex(surf, +cx, -cy, +cz, 1.0, 1.0)
v4 = AddVertex(surf, -cx, -cy, +cz, 0.0, 1.0)
; если задан с нормалями внутрь,
; здесь и далее, создаем треугольники
; обходя вершины в обратном порядке
If (invert) Then
AddTriangle(surf, v1, v4, v3)
AddTriangle(surf, v3, v2, v1)
Else
AddTriangle(surf, v1, v2, v3)
AddTriangle(surf, v3, v4, v1)
EndIf
; ---------------------------------
; верхняя грань
; ---------------------------------
; если задан мультисурфейсный, здесь и далее,
; создаем на каждую грань отдельную поверхность
If (multi) Then
surf = CreateSurface(mesh)
EndIf
v1 = AddVertex(surf, -cx, +cy, +cz, 0.0, 0.0)
v2 = AddVertex(surf, +cx, +cy, +cz, 1.0, 0.0)
v3 = AddVertex(surf, +cx, +cy, -cz, 1.0, 1.0)
v4 = AddVertex(surf, -cx, +cy, -cz, 0.0, 1.0)
If (invert) Then
AddTriangle(surf, v1, v4, v3)
AddTriangle(surf, v3, v2, v1)
Else
AddTriangle(surf, v1, v2, v3)
AddTriangle(surf, v3, v4, v1)
EndIf
; ---------------------------------
; левая грань
; ---------------------------------
If (multi) Then
surf = CreateSurface(mesh)
EndIf
v1 = AddVertex(surf, -cx, +cy, +cz, 0.0, 0.0)
v2 = AddVertex(surf, -cx, +cy, -cz, 1.0, 0.0)
v3 = AddVertex(surf, -cx, -cy, -cz, 1.0, 1.0)
v4 = AddVertex(surf, -cx, -cy, +cz, 0.0, 1.0)
If (invert) Then
AddTriangle(surf, v1, v4, v3)
AddTriangle(surf, v3, v2, v1)
Else
AddTriangle(surf, v1, v2, v3)
AddTriangle(surf, v3, v4, v1)
EndIf
; ---------------------------------
; правая грань
; ---------------------------------
If (multi) Then
surf = CreateSurface(mesh)
EndIf
v1 = AddVertex(surf, +cx, +cy, -cz, 0.0, 0.0)
v2 = AddVertex(surf, +cx, +cy, +cz, 1.0, 0.0)
v3 = AddVertex(surf, +cx, -cy, +cz, 1.0, 1.0)
v4 = AddVertex(surf, +cx, -cy, -cz, 0.0, 1.0)
If (invert) Then
AddTriangle(surf, v1, v4, v3)
AddTriangle(surf, v3, v2, v1)
Else
AddTriangle(surf, v1, v2, v3)
AddTriangle(surf, v3, v4, v1)
EndIf
; ---------------------------------
; передняя грань
; ---------------------------------
If (multi) Then
surf = CreateSurface(mesh)
EndIf
v1 = AddVertex(surf, -cx, +cy, -cz, 0.0, 0.0)
v2 = AddVertex(surf, +cx, +cy, -cz, 1.0, 0.0)
v3 = AddVertex(surf, +cx, -cy, -cz, 1.0, 1.0)
v4 = AddVertex(surf, -cx, -cy, -cz, 0.0, 1.0)
If (invert) Then
AddTriangle(surf, v1, v4, v3)
AddTriangle(surf, v3, v2, v1)
Else
AddTriangle(surf, v1, v2, v3)
AddTriangle(surf, v3, v4, v1)
EndIf
; ---------------------------------
; задняя грань
; ---------------------------------
If (multi) Then
surf = CreateSurface(mesh)
EndIf
v1 = AddVertex(surf, +cx, +cy, +cz, 0.0, 0.0)
v2 = AddVertex(surf, -cx, +cy, +cz, 1.0, 0.0)
v3 = AddVertex(surf, -cx, -cy, +cz, 1.0, 1.0)
v4 = AddVertex(surf, +cx, -cy, +cz, 0.0, 1.0)
If (invert) Then
AddTriangle(surf, v1, v4, v3)
AddTriangle(surf, v3, v2, v1)
Else
AddTriangle(surf, v1, v2, v3)
AddTriangle(surf, v3, v4, v1)
EndIf
Return mesh
End Function
; пример
Local camera%, light%, outer_text%, outer_cube%, inner_text%, inner_cube%
Graphics3D(800, 600, 0, 2)
SetBuffer(BackBuffer())
outer_text = GenerateTexture(256, 256)
; внешний куб (обратные нормали)
outer_cube = CreateCube2(25.0, 25.0, 25.0, 0, True)
EntityTexture(outer_cube, outer_text)
inner_text = GenerateTexture( 32, 32, 30.0, 30.0)
; внутренний куб
inner_cube = CreateCube2(1.0, 1.0, 1.0)
EntityTexture(inner_cube, inner_text)
; камера
camera = CreateCamera()
PositionEntity(camera, 0.0, 0.0, -5.0)
Repeat
TurnEntity(inner_cube, 1.0, 1.0, 1.0)
RenderWorld()
Flip()
Until (KeyDown(1))
End
; генерация текстуры :)
Function GenerateTexture(xs%, ys%, sx# = 10.0, sy# = 10.0, flags% = 1)
Local texture%, buffer%, ix%, iy%, pixel
texture = CreateTexture(xs, ys, flags)
buffer = TextureBuffer(texture)
LockBuffer(buffer)
iy = ys
While (iy > 0)
iy = iy - 1
ix = xs
While (ix > 0)
ix = ix - 1
pixel = 65.0 * Sin(ix * sx) + 65.0 * Sin(iy * sy)
WritePixelFast(ix, iy, pixel, buffer)
Wend
Wend
UnlockBuffer(buffer)
Return texture
End Function
ЗЫ
параметр multi нужен для мультисурфейсного кубика, если вдруг понадобится наложить на каждую грань свою текстуру
|
|
|
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
|
|
04.05.2009, 12:42
|
#4
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Поверткесная сборка.
Отлично - чётко по ТЗ (даже найдена и реализована его неоднозначность).
Нет левых констант. Отчётливое комментирование!
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
04.05.2009, 19:24
|
#5
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Поверткесная сборка.
Отлично - чётко по ТЗ (даже найдена и реализована его неоднозначность).
|
Ымпер, в какой тайный заговор ты набираешь конскриптов?
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
04.05.2009, 20:51
|
#6
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Поверткесная сборка.
Сам я не очень практивоался в сабже. Мне тербуется следующая функция.
вход Xs#,Ys#,Zs#
выход дескриптор меша
описание:
функция повертексно собирает кубик с размерами по осям:
xs - абсцисса
ys - ордината
zs - аппликата
центр меша в точке [x2/2;ys/2;zs/2].
|
а CreateSkyBox в кастле чем не угодил?
всё более чем понятно, переделать под твои нужды можно за минуту.
xs - абсцисса
ys - ордината
zs - аппликата
|
и необязательно использовать извращенские словечки если можно просто сказать "Позиция по X" и тд.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
04.05.2009, 21:35
|
#7
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Поверткесная сборка.
2 Mr_F_
толсто!
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
04.05.2009, 22:33
|
#8
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Поверткесная сборка.
да это скорее ты толст, надо умудряться так раздражать своей ботаничностью (хоть подпись твоя).
|
(Offline)
|
|
04.05.2009, 22:51
|
#9
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Поверткесная сборка.
Нашчот
дескриптор
абсцисса
ордината
апликата
это математически более правильно так говорить, но всё же проще - лучше:
хендл
X,Y,Z
главно шоб не уходила суть проблемы
Однако, пахнет наездом.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
05.05.2009, 09:12
|
#10
|
Троллота
Регистрация: 09.07.2007
Сообщений: 1,829
Написано 554 полезных сообщений (для 1,772 пользователей)
|
Ответ: Поверткесная сборка.
А наезды на человека, у которого есть доступ к админке - опасны
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:15.
|