Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Прямо триллер по мотивам простейшей физики бильярдных шаров 

Function ImpulseTranslater()
xCollisions type_ball,type_ball,2,2
xUpdateWorld
;Now my prechios data created
For biliard.ball_data =Each ball_data
;Does my current ball is collided with any other?
ph=xCountCollisions (biliard\id)
If ph>0 Then
;если таки да, значит надо подкорректировать его скорость.
;Пусть оно вернет мне c каким же именно шариком столкнулся текущий шарик, а также пусть скажет его скорость.
id=xCollisionEntity (biliard\id,0)
ReturnBallData(id)
idvx#=VecX()
idvy#=VecY()
idvz#=VecZ()
vx#=biliard\vx
vy#=biliard\vy
vz#=biliard\vz
;теперь пусть оно мне напишет нормаль столкновения.
x1#=xCollisionNX(biliard\id,0)
y1#=xCollisionNY(biliard\id,0)
z1#=xCollisionNZ(biliard\id,0)
;А теперь пусть оно мне вернет длину проекций скоростей на нормаль
proj1#=ProjectionOnVec#(x1,y1,z1,vx,vy,vz)
proj2#=ProjectionOnVec#(x1,y1,z1,idvx,idvy,idvz)
;поблагодарим за исполнительность.
ThankYou()
;теперь компьютер правильно посчитает остатки проекции после передачи импульсов и вернет их сюда.
Brain_Fucker_0000001(proj1,proj2)
newproj1#=VecX()
newproj2#=VecY()
;далее нужно модифицировать вектора скорости.
;вычитаю из векторов скорости изначальную проекцию и плюсую после обработки столкновения.
EndIf
Next
End Function
Function Brain_Fucker_0000001(proj1#,proj2#)
;нормаль направлена по радиусу ентити, от центра
;если проекция 1 меньше нуля. скорость внутрь ентити. Ентитя пытается убежать от той с которой произошел контакт.
If proj1<0 Then
If proj2<0 Then
;ентитя2 догоняет убегающую ентитю 1
;а первая ентити посмотрела на свою скорость и сказала раз у меня скорость меньше, чем у ентити2, то значит хер ты меня догонишь по тому как по модулю она больше
If proj1<proj2 Then
EndIf
;и были скорости ентитей равны и ржала первая над второй.
If proj1=proj2 Then
EndIf
;и оказалась по модулю скорость ентити 2 больше чем у первой, и огребла первая импульс равный дельте скоростей. И стало у первой импульс как у второй, а у первой как у второй.
If proj1>proj2 Then
EndIf
EndIf
If proj2=0 Then
;ентитя 2 стояла ниче не делала, а тут вдруг откуда нивозьмись, раз и въехала в неё первая, причем двигаясь от неё. Мистика
;и нихрена не произошло никакой передачи импульса. Ведь первая ентити убежала от второй
End If
If proj2>0 Then
;ентитя2 тоже пытается убежать от точки контакта.
;получилось у ентитей убежать друг от друга и осталсись проекции скоростей без изменений
End If
EndIf
;ентитя стоит себе или катится, но к шару два сама не приближается.
If proj1=0 Then
If proj2<0 Then
; а вот хер тебе сказала ентитя два и догнала ентитю 1
; и выхватила ентитя 1 от ентити 2 полный импульс, и осталось у ентити 2 ноль импульса
EndIf
If proj2=0 Then
; и было енити второй глубоко похер на первую, ибо они не сближались, но какимто образом пересеклись.
; посмотрели они друг на друга да и прокатились мимо, либо замерли рядышком. а передачи импульса не произошло.
End If
If proj2>0 Then
; и решила ентитя убежать от затаившейся ентити 1, страшно же, вдруг она подкарауливает
; и получилось у ентити2 убежать от первой. Ведь на самом деле первой ентити было плевать на вторую, хоть та и каталась впритирку.
End If
EndIf
;ентити один нагло катится на ентитю 2
If proj1>0 Then
If proj2<0 Then
; а ентити2 тоже не лыком шита и катится к ентити 1
;и как ухерачились они в лоб лоб
If proj1>-proj2 Then
;и победила первая вторую, нахлобучив её импульсом равным дельте модулей, сама же ентитя остановилась обезимпульсев
EndIf
If proj1=-proj2 Then
;ентити бодались-бодались да невыбодались и остановились потратив свои импульсы спроецированные на нормаль столкновения
EndIf
If proj1>-proj2 Then
;и победила вторая первую, нахлобучив её импульсом равным дельте модулей, сама же ентитя остановилась обезимпульсев
EndIf
EndIf
If proj2=0 Then
; ентити2 стоит себе или катиться, но к ентити 1 сама не приближается, за чо и агребет
;и огребла импульс ентити2 от первойБ а первая потратила весь импульс
End If
If proj2>0 Then
;ентитя 2 хорошо подумав решила свалить от ентити один.
If proj1>proj2 Then
;но догнала ентитити 1 ентити два и поменялась с нею размером импульса.
EndIf
If proj1=proj2 Then
;а не смогла она догнать ентитю2. И ничего не произошло, они просто коснулись.
EndIf
If proj1<proj2 Then
;гналась ентити один за второй, да не догнала. И ничего не произошло они тоже просто коснулись.
EndIf
End If
EndIf
vecar(0,0)=newproj1
vecar(1,0)=newproj2
End Function
|
|