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=5163)

ABTOMAT 30.11.2007 17:20

Как определить, какова высота меша?
 
Есть земля-мешь. Есть игрок. Вопрос: как определить, на какой высоте (Y) класть декаль тени если известны её координаты X и Z (которые совпадают с координатами игрока) ?
Подскажите плз команду, которой это определяется если таковая существует. Заранее спасибо.

Horror 30.11.2007 17:47

Re: Как определить, какова высота меша?
 
попробуй пиком!

moka 30.11.2007 17:52

Re: Как определить, какова высота меша?
 
ABTOMAT, такой(математической) не существует, если нету закономерности у индексов вершин. Если террайн создаёться в блице но мешем, то есть возможность.
Вот примерно так выглядит математическая версия функции, она полностью на математике, и поэтому её производительность на высоте (без проблем вызывай хоть по 10 раз за цикл)
Код:

Function mTerrainY#(x#,z#) ; Terrain
        Local TerTotTilWH%=(CCnt*TilS)
        Local TerCurQuadX%,TerCurQuadZ%
        Local TerCurX#,TerCurZ#
        Local tX1#,tZ1#,tY1#
        Local tX2#,tZ2#,tY2#
        Local tX3#,tZ3#,tY3#
        Local QuadPX#,QuadPZ#
        Local a#,b#,c#,d#

        If x>0
                If x<(HeightMapS*TilS)
                        If z>0
                                If z<(HeightMapS*TilS)
                                        For t.Ter=Each Ter
                                       
                                                TerCurX#=((t\X-1)*TerTotTilWH)
                                                TerCurZ#=((t\Z-1)*TerTotTilWH)
                                               
                                                If x>TerCurX
                                                        If x<((t\X)*TerTotTilWH)
                                                                If z>TerCurZ
                                                                        If z<((t\Z)*TerTotTilWH)
                                                                               
                                                                                TerCurQuadX=((x-TerCurX-(TilS*.5))/TilS)
                                                                                TerCurQuadZ=((z-TerCurZ-(TilS*.5))/TilS)
                                                                                QuadPX=      (x-TerCurX-(TerCurQuadX*TilS))
                                                                                QuadPZ=(TilS-(z-TerCurZ-(TerCurQuadZ*TilS)))
                                                                               
                                                                                If TerQR(t\X,t\Z,TerCurQuadZ,TerCurQuadX)=1
                                                                                        tX2=(((TerCurQuadX+1)*TilS)+TerCurX)
                                                                                        tZ2=((TerCurQuadZ*TilS)+TerCurZ)
                                                                                        tY2=TerVY(t\x,t\z,(TerCurQuadX+1),TerCurQuadZ)
                                                                                        tX3=tX2-TilS
                                                                                        tZ3=tZ2+TilS
                                                                                        tY3=TerVY(t\x,t\z,TerCurQuadX,(TerCurQuadZ+1))
                                                                                        If ((TilS-QuadPX)+QuadPZ)>TilS
                                                                                                tX1=tX3
                                                                                                tZ1=tZ2
                                                                                                tY1=TerVY(t\x,t\z,TerCurQuadX,TerCurQuadZ)
                                                                                        Else
                                                                                                tX1=tX2
                                                                                                tZ1=tZ3
                                                                                                tY1=TerVY(t\x,t\z,(TerCurQuadX+1),(TerCurQuadZ+1))
                                                                                        EndIf
                                                                                Else
                                                                                        tX2=((TerCurQuadX*TilS)+TerCurX)
                                                                                        tZ2=((TerCurQuadZ*TilS)+TerCurZ)
                                                                                        tY2=TerVY(t\x,t\z,TerCurQuadX,TerCurQuadZ)
                                                                                        tX3=tX2+TilS
                                                                                        tZ3=tZ2+TilS
                                                                                        tY3=TerVY(t\x,t\z,(TerCurQuadX+1),(TerCurQuadZ+1))
                                                                                        If (QuadPX+QuadPZ)>TilS
                                                                                                tX1=tX3
                                                                                                tZ1=tZ2
                                                                                                tY1=TerVY(t\x,t\z,(TerCurQuadX+1),TerCurQuadZ)
                                                                                        Else
                                                                                                tX1=tX2
                                                                                                tZ1=tZ3
                                                                                                tY1=TerVY(t\x,t\z,TerCurQuadX,(TerCurQuadZ+1))
                                                                                        EndIf
                                                                                EndIf
                                                                               
                                                                                a#=-(tz3*ty2-tz1*ty2-tz3*ty1+ty1*tz2+ty3*tz1-tz2*ty3)
                                                                                b#= (tz1*tx3+tz2*tx1+tz3*tx2-tz2*tx3-tz1*tx2-tz3*tx1)
                                                                                c#= (ty2*tx3+ty1*tx2+ty3*tx1-ty1*tx3-ty2*tx1-tx2*ty3)
                                                                                d#=-a*tx1-b*ty1-c*tz1
                                                                               
                                                                                Y#=-(a*x+c*z+d)/b
                                                                               
                                                                                Return Y
                                                                        EndIf
                                                                EndIf
                                                        EndIf
                                                EndIf
                                        Next
                                EndIf
                        EndIf
                EndIf
        EndIf
End Function

А так можешь покурить это.
Делал по этой статье.

ABTOMAT 30.11.2007 18:56

Re: Как определить, какова высота меша?
 
У меня террайн не содержит закономерностей... Видимо, твоя функция не поможет.

moka 30.11.2007 19:57

Re: Как определить, какова высота меша?
 
ABTOMAT, тогда находи триангл на котором высота (это уже сам), и юзай этот алгоритмик, спомощью него должно прокатить, но не гарантирую.
Код:

a#=-(tz3*ty2-tz1*ty2-tz3*ty1+ty1*tz2+ty3*tz1-tz2*ty3)
b#= (tz1*tx3+tz2*tx1+tz3*tx2-tz2*tx3-tz1*tx2-tz3*tx1)
c#= (ty2*tx3+ty1*tx2+ty3*tx1-ty1*tx3-ty2*tx1-tx2*ty3)
d#=-a*tx1-b*ty1-c*tz1
Y#=-(a*x+c*z+d)/b


tormoz 30.11.2007 20:14

Re: Как определить, какова высота меша?
 
Пиком будет проще
а скорость там не нужна (для декалей) онож не в цикле

ABTOMAT 30.11.2007 20:54

Re: Как определить, какова высота меша?
 
tormoz, я вообще-то хотел сделать тень, которая следует за игроком...

Но в принципе пик сойдёт для статики, тока надо алгоритмик сделать чтоб тенёк ровненько ложился :)

Ежели у кого есть, плз дайте примерчег где как раз есть тень, которая двигается по неровной поверхности.

Заранее спасибо.


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

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