forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Работа с треугольниками (http://forum.boolean.name/showthread.php?t=18679)

Devilox 06.11.2013 18:45

Работа с треугольниками
 
Возможно ли применять кисть к отдельному треугольнику, а не к всему Surface-у?

ABTOMAT 06.11.2013 19:20

Ответ: Работа с треугольниками
 
Нет, нельзя. Придётся создать отдельный сурфейс.

Devilox 06.11.2013 19:24

Ответ: Работа с треугольниками
 
Тогда какой наименее затратный способ перевести все треугольники объекта в surface-ы?
P.S. Освещение нужно имитировать

ABTOMAT 06.11.2013 19:34

Ответ: Работа с треугольниками
 
От такого количества сурфейсов скорость вся загнётся
Может, освещение лучше имитировать как-то иначе? Цветами вершин, например?

Devilox 06.11.2013 19:52

Ответ: Работа с треугольниками
 
А соприкасающиеся треугольники имеют разные vertex-ы?
P.S. Я просто хочу высчитывать нормали каждого треугольника, а потом менять цвет. На соединении граней могут быть лаги.

ABTOMAT 06.11.2013 21:18

Ответ: Работа с треугольниками
 
Цитата:

Сообщение от Devilox (Сообщение 269724)
А соприкасающиеся треугольники имеют разные vertex-ы?

Как сделаешь так и будет.
Ты что-то типа этого хочешь?

Тогда это делается намного проще.

Devilox 06.11.2013 21:24

Ответ: Работа с треугольниками
 
Получилось, спасибо)
Код:

Global player
Global cam

Global sphere
Global lamp

Graphics3D 800,600,32,2
SetBuffer BackBuffer()


cam = CreateCamera()

player = CreateSphere()
EntityParent cam,player

piv = CreatePivot()

lamp = CreateSphere()
ScaleEntity lamp,0.1,0.1,0.1
PositionEntity lamp,2,1,-5

sphere = CreateSphere()
PositionEntity sphere,0,0,5
EntityFX sphere,35

While Not KeyHit(1)

CreateLightmap()

If KeyDown(200)
        MoveEntity lamp,0,0.1,0
ElseIf KeyDown(208)
        MoveEntity lamp,0,-0.1,0
EndIf

If KeyDown(203)
        MoveEntity lamp,-0.1,0,0
ElseIf KeyDown(205)
        MoveEntity lamp,0.1,0,0
EndIf


TurnEntity cam,MouseYSpeed()/5,0,0
TurnEntity player,0,-MouseXSpeed()/5,0
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
RotateEntity cam,EntityPitch(cam),0,0,0

If KeyDown(17)
        TranslateEntity player,(-0.5 * Cos(EntityPitch(cam))) * Sin(EntityYaw(player)),-0.5 * Sin(EntityPitch(cam)),(0.5 * Cos(EntityPitch(cam))) * Cos(EntityYaw(player))
ElseIf KeyDown(31)
        TranslateEntity player,(0.5 * Cos(EntityPitch(cam))) * Sin(EntityYaw(player)),0.5 * Sin(EntityPitch(cam)),(-0.5 * Cos(EntityPitch(cam))) * Cos(EntityYaw(player))
EndIf

If KeyDown(30)
        MoveEntity player,-0.5,0,0
ElseIf KeyDown(32)
        MoveEntity player,0.5,0,0
EndIf

UpdateWorld()
RenderWorld()

Text 10,10,("Use arrows to move the lamp")
Text 10,20,("Use WASD to move the observer")
Text 10,30,("Free look is available")

Flip

Wend

End

;----------Functions----------;

Function CreateLightmap()
        For m = 1 To CountSurfaces(sphere)
                surf = GetSurface(sphere,m)
                For n = 1 To CountTriangles(surf)
                        v0 = TriangleVertex(surf,n,0)
                        v1 = TriangleVertex(surf,n,-1)
                        v2 = TriangleVertex(surf,n,-2)
                       
                        v0v1X# = VertexX(surf,v1) - VertexX(surf,v0)
                        v0v1Y# = VertexY(surf,v1) - VertexY(surf,v0)
                        v0v1Z# = VertexZ(surf,v1) - VertexZ(surf,v0)
                       
                        v0v2X# = VertexX(surf,v2) - VertexX(surf,v0)
                        v0v2Y# = VertexY(surf,v2) - VertexY(surf,v0)
                        v0v2Z# = VertexZ(surf,v2) - VertexZ(surf,v0)
                       
                        i# = (v0v1Y * v0v2Z - v0v2Y * v0v1Z)
                        j# = (v0v1Z * v0v2X - v0v2Z * v0v1X)
                        k# = (v0v1X * v0v2Y - v0v2X * v0v1Y)
                       
                        x# = EntityX(lamp) - ((VertexX(surf,v0) + VertexX(surf,v1) + VertexX(surf,v2)) / 3)
                        y# = EntityY(lamp) - ((VertexY(surf,v0) + VertexY(surf,v1) + VertexY(surf,v2)) / 3)
                        z# = EntityZ(lamp) - ((VertexZ(surf,v0) + VertexZ(surf,v1) + VertexZ(surf,v2)) / 3)
                       
                        CosA# = (x * i + y * j + z * k) / (Sqr(x^2 + y^2 + z^2) * Sqr(i^2 + j^2 + k^2))
                       
                        If CosA >= 0
                                VertexColor(surf,v0,0,0,0)
                                VertexColor(surf,v1,0,0,0)
                                VertexColor(surf,v2,0,0,0)
                        Else
                                VertexColor(surf,v0,255 * -CosA,255 * -CosA,255 * -CosA)
                                VertexColor(surf,v1,255 * -CosA,255 * -CosA,255 * -CosA)
                                VertexColor(surf,v2,255 * -CosA,255 * -CosA,255 * -CosA)
                        EndIf
                Next
        Next
End Function


Devilox 06.11.2013 21:25

Ответ: Работа с треугольниками
 
Только вот созданный exe-шник не открывается: пишет MAV...
Памяти должно хватать..
P.S. мб, вычисления библиотекой делать?

Devilox 06.11.2013 22:43

Ответ: Работа с треугольниками
 
Блин, зачем я матрицы вычислял... В blitz-е уже всё есть :-D
Код:

Function CreateLightmap()
        For m = 1 To CountSurfaces(sphere)
                surf = GetSurface(sphere,m)
                For n = 1 To CountVertices(surf)
                                                       
                        i# = VertexNX(surf,n)
                        j# = VertexNY(surf,n)
                        k# = VertexNZ(surf,n)
                       
                        x# = EntityX(lamp) - VertexX(surf,n)
                        y# = EntityY(lamp) - VertexY(surf,n)
                        z# = EntityZ(lamp) - VertexZ(surf,n)
                       
                        CosA# = (x * i + y * j + z * k) / (Sqr(x^2 + y^2 + z^2) * Sqr(i^2 + j^2 + k^2))
                       
                        If CosA <= 0
                                VertexColor(surf,n,0,0,0)
                        Else
                                VertexColor(surf,n,255 * CosA,255 * CosA,255 * CosA)
                        EndIf
                Next
        Next
End Function

Только вот при использовании максовских моделек появляются вывернутые наизнанку вертексы
Да и вообще стало неправильно работать, матрицы считать лучше, но MAV часто вылетает

Devilox 07.11.2013 08:52

Ответ: Работа с треугольниками
 
Похоже, что проверка нормалей - плохая затея. Может, кто знает другие алгоритмы реализации освещения?

ARA 07.11.2013 17:23

Ответ: Работа с треугольниками
 
А чем не устроило CreateLight()?

Devilox 07.11.2013 17:38

Ответ: Работа с треугольниками
 
Нет затемнения неосвещённых частей

ARA 07.11.2013 17:45

Ответ: Работа с треугольниками
 
За затемнения отвечает AmbientLight()
Или ты про отбрасывание теней?

Devilox 07.11.2013 17:52

Ответ: Работа с треугольниками
 
Тени тоже

ARA 07.11.2013 18:07

Ответ: Работа с треугольниками
 
Самый ок способ освещения в бляце - лайтмапы. Всё остальное фуфел.


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

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