Показать сообщение отдельно
Старый 30.11.2007, 17:52   #3
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
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
А так можешь покурить это.
Делал по этой статье.
(Offline)
 
Ответить с цитированием