Показать сообщение отдельно
Старый 04.05.2009, 10:52   #3
Venom2
 
Сообщений: n/a
Ответ: Поверткесная сборка.

функция повертексно собирает кубик
Держи, "повертекснее" некуда
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 пользователя(ей) сказали Спасибо за это полезное сообщение:
impersonalis (04.05.2009), tormoz (04.05.2009)