Показать сообщение отдельно
Старый 10.10.2006, 00:55   #1
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Колючий mesh

Короче, лучше один раз увидеть:
Вложение 1892
Скачать пример можно здесь
Вложение 1894
Вот сама функция:

Function CreateIgls(sm,height#=2.0)
;================================================= =================
;Function: CreateIgls(mesh,lenght)
;Параметры
;mesh - модель для которой надо сделать иглы
;Lenght - длина игл.
;Описание
;Создает для модели иглы. Возвращает указатель на модель содержащую иглы
;длина игл может быть равна 1 тогда игл ваще не будет, может быть отрицательной
;Autor :Олег Сапронов a.k.a. HolyDel
;Email: [email protected]
;Version:1
;Date: 2006.10.09
;================================================= =================

m=CreateMesh()
s=CreateSurface(m)
ss=GetSurface(sm,1)
For i=0 To CountTriangles(ss)-1
ssv0=TriangleVertex(ss,i,0)
ssv1=TriangleVertex(ss,i,1)
ssv2=TriangleVertex(ss,i,2)
ssv0x#=VertexX(ss,ssv0)
ssv0y#=VertexY(ss,ssv0)
ssv0z#=VertexZ(ss,ssv0)
ssv0u#=VertexU(ss,ssv0)
ssv0v#=VertexV(ss,ssv0)
ssv0w#=VertexW(ss,ssv0)
ssv0nx#=VertexNX(ss,ssv0)
ssv0ny#=VertexNY(ss,ssv0)
ssv0nz#=VertexNZ(ss,ssv0)
ssv1x#=VertexX(ss,ssv1)
ssv1y#=VertexY(ss,ssv1)
ssv1z#=VertexZ(ss,ssv1)
ssv1u#=VertexU(ss,ssv1)
ssv1v#=VertexV(ss,ssv1)
ssv1w#=VertexW(ss,ssv1)
ssv1nx#=VertexNX(ss,ssv1)
ssv1ny#=VertexNY(ss,ssv1)
ssv1nz#=VertexNZ(ss,ssv1)
ssv2x#=VertexX(ss,ssv2)
ssv2y#=VertexY(ss,ssv2)
ssv2z#=VertexZ(ss,ssv2)
ssv2u#=VertexU(ss,ssv2)
ssv2v#=VertexV(ss,ssv2)
ssv2w#=VertexW(ss,ssv2)
ssv2nx#=VertexNX(ss,ssv0)
ssv2ny#=VertexNY(ss,ssv0)
ssv2nz#=VertexNZ(ss,ssv0)
ssnvx#=(ssv0x#+ssv1x#+ssv2x#)/3.0*height
ssnvy#=(ssv0y#+ssv1y#+ssv2y#)/3.0*height
ssnvz#=(ssv0z#+ssv1z#+ssv2z#)/3.0*height
ssnvu#=(ssv0u#+ssv1u#+ssv2u#)/3.0
ssnvv#=(ssv0v#+ssv1v#+ssv2v#)/3.0
ssnvw#=(ssv0w#+ssv1w#+ssv2w#)/3.0
ssnvnx=(ssv0nx#+ssv1nx#+ssv2nx#)/3.0
ssnvny=(ssv0ny#+ssv1ny#+ssv2ny#)/3.0
ssnvnz=(ssv0nz#+ssv1nz#+ssv2nz#)/3.0
nv0=AddVertex(s,ssv0x,ssv0y,ssv0z,ssv0u,ssv0v,ssv0 w)
nv1=AddVertex(s,ssv1x,ssv1y,ssv1z,ssv1u,ssv1v,ssv1 w)
nv2=AddVertex(s,ssv2x,ssv2y,ssv2z,ssv2u,ssv2v,ssv2 w)
nv=AddVertex(s,ssnvx,ssnvy,ssnvz,ssnvu,ssnvv,ssnvw )
VertexNormal(s,nv0,ssv0nx,ssv0ny,ssv0nz)
VertexNormal(s,nv1,ssv1nx,ssv1ny,ssv1nz)
VertexNormal(s,nv2,ssv2nx,ssv2ny,ssv2nz)
VertexNormal(s,nv,ssnvnx,ssnvny,ssnvnz)
AddTriangle(s,nv0,nv,nv2)
AddTriangle(s,nv1,nv,nv0)
AddTriangle(s,nv2,nv,nv1)
Next
UpdateNormals m
Return m
End Function

А вот функция создающая плоское кольцо:

Function createring(r1#=1,r2#=2,seg=16,dual=0)
;================================================= =================
;Function: CreateRing(r1#,r2#,seg,dual)
;Параметры
;r1 - внутренний радиус
;r2 - внешний радиус
;seg - количество сегментов
;dual - если 1, то кольцо будет двусторонним
;Описание
;Создает плоское кольцо. Возвращает указатель на модель кольца
;Autor :Олег Сапронов a.k.a. HolyDel
;Email: [email protected]
;Version:1
;Date: 2006.10.09
;================================================= =================
da#=360/seg
a#=0
m=CreateMesh()
s=CreateSurface(m)
vx1#=Sin(a)*r1
vx2#=Sin(a)*r2
vz1#=Cos(a)*r1
vz2#=Cos(a)*r2
v0=AddVertex(s,vx1,0,vz1)
v1=AddVertex(s,vx2,0,vz2)
fv0=v0
fv1=v1
While a<360-da
a=a+da#
vx1#=Sin(a)*r1
vx2#=Sin(a)*r2
vz1#=Cos(a)*r1
vz2#=Cos(a)*r2
v2=AddVertex(s,vx1,0,vz1)
v3=AddVertex(s,vx2,0,vz2)
AddTriangle(s,v1,v3,v0)
AddTriangle(s,v3,v2,v0)
If dual
AddTriangle(s,v3,v1,v0)
AddTriangle(s,v2,v3,v0)
EndIf
v0=v2
v1=v3
Wend
vx1#=Sin(a)*r1
vx2#=Sin(a)*r2
vz1#=Cos(a)*r1
vz2#=Cos(a)*r2
v2=AddVertex(s,vx1,0,vz1)
v3=AddVertex(s,vx2,0,vz2)
AddTriangle(s,fv1,fv0,v2)
AddTriangle(s,v2,v3,fv1)
If dual
AddTriangle(s,fv0,fv1,v2)
AddTriangle(s,v3,v2,fv1)
EndIf
UpdateNormals m
Return m
End Function

З.Ы. Если вдруг соберетесь использовать функцию то лучше использовать ту что приведенена здесь, а не в примере, ибо там есть ошибка.
(Offline)
 
Ответить с цитированием