Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Re: b3d хелп или описание
Только если узнаешь конкретную текстуру под "ногами"
На старом Блитцфоруме я выкладывал функции для этого. Жаль он не работает. Ща поищу в своей помойке...
Нашел. Разбирайся сам - сложная штука. Писалось давно уже все забыл 
Можно определить текстуру. ее цвет, координаты натекстуре и тп

Global PickU#,PickV#,texture_buffer,texture_t,color_t%
Global LOverlapX#, LOverlapY#
Type TLine
Field x#
Field y#
Field dx#
Field dy#
End Type
Type TVector
Field x#, y#, z#
End Type
Function PickedToTexture(layer_t)
x#=PickedX()
y#=PickedY()
z#=PickedZ()
ent = PickedEntity()
surf = PickedSurface()
brush=GetSurfaceBrush(surf)
texture_t =GetBrushTexture(brush,layer_t)
texture_buffer=TextureBuffer(texture_t)
tri = PickedTriangle()
;transform
TFormPoint x, y, z, 0, ent
x=TFormedX()
y=TFormedY()
z=TFormedZ()
;coords of texture
u0#=VertexU(surf, TriangleVertex(surf, tri, 0),layer_t)
v0#=VertexV(surf, TriangleVertex(surf, tri, 0),layer_t)
u1#=VertexU(surf, TriangleVertex(surf, tri, 1),layer_t)
v1#=VertexV(surf, TriangleVertex(surf, tri, 1),layer_t)
Tex1=NewVector(u1-u0, v1-v0, 0)
u2#=VertexU(surf, TriangleVertex(surf, tri, 2),layer_t)
v2#=VertexV(surf, TriangleVertex(surf, tri, 2),layer_t)
Tex2=NewVector(u2-u0, v2-v0, 0)
;coords of vertex
gx0#=VertexX(surf, TriangleVertex(surf, tri, 0))
gy0#=VertexY(surf, TriangleVertex(surf, tri, 0))
gz0#=VertexZ(surf, TriangleVertex(surf, tri, 0))
gx1#=VertexX(surf, TriangleVertex(surf, tri, 1))
gy1#=VertexY(surf, TriangleVertex(surf, tri, 1))
gz1#=VertexZ(surf, TriangleVertex(surf, tri, 1))
Vt1=NewVector(gx1-gx0, gy1-gy0, gz1-gz0)
gx2#=VertexX(surf, TriangleVertex(surf, tri, 2))
gy2#=VertexY(surf, TriangleVertex(surf, tri, 2))
gz2#=VertexZ(surf, TriangleVertex(surf, tri, 2))
Vt2=NewVector(gx2-gx0, gy2-gy0, gz2-gz0)
Vt3=NewVector(x-gx0, y-gy0, z-gz0)
;angles vectors (V*)
av102#=AngleVectors(Vt1, Vt2)
av302#=AngleVectors(Vt3, Vt2)
Dav#=av302/av102
;angles vectors (Tex*)
at102#=AngleVectors(Tex1, Tex2)
at302#=at102*Dav
;projection V*
l01#=LenVector(Vt1)
l02#=LenVector(Vt2)
l03#=LenVector(Vt3)
gx1#=l01*Cos(av102)
gy1#=l01*Sin(av102)
Line12=NewLine(l02, 0, gx1, gy1)
gx3#=l03*Cos(av302)
gy3#=l03*Sin(av302)
Line03=NewLine(0, 0, gx3, gy3)
LinesIntersect(Line12, Line03)
Line04=NewLine(0, 0, IntersectX(), IntersectY())
DL#=LenLine(Line03)/LenLine(Line04)
Line14=NewLine(gx1, gy1, IntersectX(), IntersectY())
DL2#=LenLine(Line14)/LenLine(Line12)
;projection Tex*
Line12=NewLine(u1, v1, u2, v2)
MulLine(Line12, DL2)
Line04=NewLine(u0, v0, LineX2(Line12), LineY2(Line12))
MulLine(Line04, DL)
PickU=LineX2(Line04)
PickV=LineY2(Line04)
;delete
Delete Each TVector
Delete Each TLine
End Function
Function NewLine(x1#, y1#, x2#, y2#)
g.TLine=New TLine
g\x=x1
g\y=y1
g\dx=x2-x1
g\dy=y2-y1
Return Handle(g)
End Function
Function DelLine(id)
g.TLine=Object.TLine(id)
If g=Null Return
Delete g
End Function
Function LenLine#(id)
g.TLine=Object.TLine(id)
If g=Null Return -1
Return Sqr(g\dx*g\dx+g\dy*g\dy)
End Function
Function MulLine(id, k#)
g.TLine=Object.TLine(id)
If g=Null Return
g\dx=g\dx*k
g\dy=g\dy*k
End Function
Function LineX2#(id)
g.TLine=Object.TLine(id)
If g=Null Return 0
Return g\x+g\dx
End Function
Function LineY2#(id)
g.TLine=Object.TLine(id)
If g=Null Return 0
Return g\y+g\dy
End Function
Function LineX1#(id)
g.TLine=Object.TLine(id)
If g=Null Return 0
Return g\x
End Function
Function LineY1#(id)
g.TLine=Object.TLine(id)
If g=Null Return 0
Return g\y
End Function
Function ResetLine(id,x1#, y1#, x2#, y2#)
g.TLine=Object.TLine(id)
If g=Null Return
g\x=x1
g\y=y1
g\dx=x2-x1
g\dy=y2-y1
End Function
Function LinesIntersect(id1, id2)
g1.TLine=Object.TLine(id1)
If g1=Null Return
g2.TLine=Object.TLine(id2)
If g2=Null Return
;line N1
a1#=g1\dy
b1#=-g1\dx
c1#=a1 * g1\x + b1 * g1\y
;line N2
a2#=g2\dy
b2#=-g2\dx
c2#=a2 * g2\x + b2 * g2\y
;calculate
dx#=c1*b2-c2*b1
dy#=a1*c2-a2*c1
d#=a1*b2-a2*b1
If d=0 Return 0
LOverlapX#=dx/d
LOverlapY#=dy/d
Return 1
End Function
Function IntersectX#()
Return LOverlapX
End Function
Function IntersectY#()
Return LOverlapY
End Function
;==================
;=============================
Function NewVector(x#, y#, z#)
v.TVector=New TVector
v\x=x
v\y=y
v\z=z
Return Handle(v)
End Function
Function DelVector(id)
v.Tvector=Object.Tvector(ID)
If v=Null Return
Delete v
End Function
Function LenVector#(ID)
v.Tvector=Object.Tvector(ID)
If v=Null Return 0
Return Sqr(v\x*v\x+v\y*v\y+v\z*v\z)
End Function
Function MulScalar#(id1, id2)
v1.Tvector=Object.Tvector(id1)
If v1=Null Return 0
v2.Tvector=Object.Tvector(id2)
If v2=Null Return 0
Return v1\x * v2\x + v1\y * v2\y + v1\z * v2\z
End Function
Function AngleVectors#(id1, id2)
v1.Tvector=Object.Tvector(id1)
If v1=Null Return 0
v2.Tvector=Object.Tvector(id2)
If v2=Null Return 0
Return ACos(MulScalar(id1, id2)/LenVector(id1)/LenVector(id2))
End Function
Function TurnVectorXY(id, angle#)
v.Tvector=Object.Tvector(ID)
If v=Null Return
cn#=Cos(angle)
sn#=-Sin(angle)
oldX#=v\x
oldY#=v\y
v\x=oldX * cn - oldY * sn
v\y=oldY * cn + oldX * sn
End Function
;===================
Function argb%(a%,r%=0,g%=0,b%=0)
Return (a Shl 24) Or (r Shl 16) Or (g Shl 8) Or b
End Function
Function rgb%(r%,g%,b%)
Return (r Shl 16) Or (g Shl 8) Or b
End Function
Function geta%(val%)
Return (val Shr 24)
End Function
Function getr%(val%)
Return (val Shr 16) And ($000000FF)
End Function
Function getg%(val%)
Return (val Shr 8) And ($000000FF)
End Function
Function getb%(val%)
Return (val And $000000FF)
End Function
__________________
|