forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Поверткесная сборка. (http://forum.boolean.name/showthread.php?t=8247)

impersonalis 03.05.2009 21:30

Поверткесная сборка.
 
Сам я не очень практивоался в сабже. Мне тербуется следующая функция.
вход Xs#,Ys#,Zs#
выход дескриптор меша
описание:
функция повертексно собирает кубик с размерами по осям:
xs - абсцисса
ys - ордината
zs - аппликата
центр меша в точке [x2/2;ys/2;zs/2].
Предусмотреть возможность (реализовать) 4ого аргумента,который овтечает за направление номралей меша (из_центра/в_центр). Это позволит делать параллелепипед видмый снраужи/внтури.
Заранее спасибо.

L.D.M.T. 03.05.2009 22:22

Ответ: Поверткесная сборка.
 
;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

Venom2 04.05.2009 10:52

Ответ: Поверткесная сборка.
 
Цитата:

функция повертексно собирает кубик
Держи, "повертекснее" некуда :)
Код:

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 нужен для мультисурфейсного кубика, если вдруг понадобится наложить на каждую грань свою текстуру

impersonalis 04.05.2009 12:42

Ответ: Поверткесная сборка.
 
Отлично - чётко по ТЗ (даже найдена и реализована его неоднозначность).
Нет левых констант. Отчётливое комментирование!

ABTOMAT 04.05.2009 19:24

Ответ: Поверткесная сборка.
 
Цитата:

Отлично - чётко по ТЗ (даже найдена и реализована его неоднозначность).
Ымпер, в какой тайный заговор ты набираешь конскриптов?

Mr_F_ 04.05.2009 20:51

Ответ: Поверткесная сборка.
 
Цитата:

Сам я не очень практивоался в сабже. Мне тербуется следующая функция.
вход Xs#,Ys#,Zs#
выход дескриптор меша
описание:
функция повертексно собирает кубик с размерами по осям:
xs - абсцисса
ys - ордината
zs - аппликата
центр меша в точке [x2/2;ys/2;zs/2].
а CreateSkyBox в кастле чем не угодил?
всё более чем понятно, переделать под твои нужды можно за минуту.

Цитата:

xs - абсцисса
ys - ордината
zs - аппликата
и необязательно использовать извращенские словечки если можно просто сказать "Позиция по X" и тд.

impersonalis 04.05.2009 21:35

Ответ: Поверткесная сборка.
 
2Mr_F_
:pure_magic: толсто!

Mr_F_ 04.05.2009 22:33

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

ABTOMAT 04.05.2009 22:51

Ответ: Поверткесная сборка.
 
Нашчот
дескриптор
абсцисса
ордината
апликата
это математически более правильно так говорить, но всё же проще - лучше:
хендл
X,Y,Z
главно шоб не уходила суть проблемы

Однако, пахнет наездом.

Tadeus 05.05.2009 09:12

Ответ: Поверткесная сборка.
 
А наезды на человека, у которого есть доступ к админке - опасны :wild:


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

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