Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D

Ответ
 
Опции темы
Старый 02.11.2012, 16:40   #1
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Отскок мяча

День добрый!
Появилась идея реализовывать физические процессы в Blitz-е(т.к. хоть что-то получается на нём писать).
У меня есть мяч, который я запускаю. Как сделать проверку угла, под которым мяч врезается в стену?
__________________
(Offline)
 
Ответить с цитированием
Старый 02.11.2012, 17:25   #2
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: Отскок мяча

Делай проверку во время столкновения.
colEnt = EntityCollided(Model,coll_world)
If colEnt<>0 Then
For c% = 1 To CountCollisions(model)
nx# = nx + CollisionNX(Model,c)
ny# = ny + CollisionNY(Model,c)
nz# = nz + CollisionNZ(Model,c)
Next
nx = nx / n
ny = ny / n
nz = nz / n
VdotN# = VelX# * Nx + VelY# * Ny + Velz# * Nz
NFx# = -2.0 * Nx * VdotN
NFy# = -2.0 * Ny * VdotN
NFz# = -2.0 * Nz * VdotN
VelX# = VelX# + Nfx
Vely# = Vely# + Nfy
Velz# = Velz# + Nfz
End If
где VelX, velY, velZ - вектор скорости мяча
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (02.11.2012)
Старый 03.11.2012, 13:57   #3
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Отскок мяча

Только вот вопрос: а что такое "n"?
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
H@NON (03.11.2012)
Старый 03.11.2012, 14:59   #4
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: Отскок мяча

"n" это "с" )) неправильно указал я) "с" - это счетчик, ты в цикле складываешь все углы коллизии, а потом делишь на их количество, тем самым получаешь среднее арифметическое. Это нужно если коллизий будет больше одной.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (04.11.2012)
Старый 03.11.2012, 20:07   #5
DarkInside
Разработчик
 
Аватар для DarkInside
 
Регистрация: 08.08.2011
Сообщений: 505
Написано 191 полезных сообщений
(для 369 пользователей)
Ответ: Отскок мяча

эмм...а не проще брать координаты мяча при броске и координаты мяча при столкновении с объектом, а потом рассчитывать угол по этим координатам?



Вот как-то так..
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (04.11.2012)
Старый 05.11.2012, 00:14   #6
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Отскок мяча

Второй вариант не будет работать, т.к. если вращать стену вокруг точки соприкосновения с треугольником, угол альфа будет неизменен
По-моему, чтобы работало, надо стороне B быть перпендикулярной стене...
__________________
(Offline)
 
Ответить с цитированием
Старый 05.11.2012, 04:42   #7
DarkInside
Разработчик
 
Аватар для DarkInside
 
Регистрация: 08.08.2011
Сообщений: 505
Написано 191 полезных сообщений
(для 369 пользователей)
Ответ: Отскок мяча

Берешь и складываешь полученный угол с углом, на который повёрнута стена относительно глобальных координат...чудеса?
По-моему, чтобы работало, надо стороне B быть перпендикулярной стене
Нет, ты не понял идею...отрезок В перпендикулярен оси X, отрезок А перпендикулярен оси Y... И вообще их нет, это просто проекции осей Х и У для наглядного представления.

На первом рисунке шар ударяет в стену под углом 27 градусов, На рисунке 2 поворачиваем стену на 30 градусов, шар ударяет под углом 57 градусов...мистика

А отскакивать будет в первом случае на 63 грудуса, а во втором на (63 - 30*) = 33 градуса относительно проекции на ось У (отрезок В)
* - угол поворота стены

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (05.11.2012)
Старый 05.11.2012, 09:16   #8
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Отскок мяча

Аааа, я понял... Это работает тогда, когда мы создаём стену в самом блитзе(у нас есть угол поворота стены), а если у нас целый уровень из стен, то ничего не получится... Или я ошибаюсь....
Я вчера весь вечер мозг ломал, как, не зная угла наклона стены и имея лишь одни координаты, расчитать угол...
__________________
(Offline)
 
Ответить с цитированием
Старый 05.11.2012, 13:21   #9
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: Отскок мяча

берешь шарик и проверяешь его в цикле
For c% = 1 To CountCollisions(sharik)
colEnt = CollisionEntity(model,c)
nx# = CollisionNX(colEnt,c)
ny# = CollisionNY(colEnt,c)
nz# = CollisionNZ(colEnt,c)
Next
Это и будет вектор наклона стены. А из вектора наклона уже через стандартные команды блитца VectorPitch, VectorYaw находишь углы
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (05.11.2012)
Старый 05.11.2012, 14:08   #10
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Отскок мяча

Какой-то странный отскок получился: вдоль плоскостей...
Вложения
Тип файла: rar physics.rar (1.1 Кб, 466 просмотров)
__________________
(Offline)
 
Ответить с цитированием
Старый 05.11.2012, 18:13   #11
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Отскок мяча

Почему отскока в лобовую нет?
__________________
(Offline)
 
Ответить с цитированием
Старый 05.11.2012, 22:36   #12
DarkInside
Разработчик
 
Аватар для DarkInside
 
Регистрация: 08.08.2011
Сообщений: 505
Написано 191 полезных сообщений
(для 369 пользователей)
Ответ: Отскок мяча

что-то ты тут намудрил с углами, я не знаток тригонометрии и опыта 3д кодинга у меня нет...

Когда меняешь вот это:
ex_bul\xspeed = ex_bul\xspeed + nfx
ex_bul\yspeed = ex_bul\yspeed + nfy
ex_bul\zspeed = ex_bul\zspeed + nfz
На вот это:
			
ex_bul\zspeed = ex_bul\zspeed -0.1
то отскок вроде нормальный, если стрелять в ту стену, напротив которой появляешься.
Если стреляешь вбок стены, то надо ставить вот это:
			
ex_bul\yspeed = ex_bul\yspeed -0.1
То есть nfx#, nfy# и nfz# примерно должны быть около -0.1, а у тебя они имеют какие-то странные значения во время столкновения они меняются от -0.0001 до 0.05.

А вообще возьми PhysX и не мучайся
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Devilox (05.11.2012)
Старый 05.11.2012, 23:09   #13
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Отскок мяча

Да, тут надо каким-то образом определять грань стены, тогда будет известен знак перед 0.1, не могу понять, как работает CollisionNX(NY, NZ)
Я PhysX пробовал, но что-то в нём до конца не разобрался(видимо, я слишком ленивый ), вот и решил собственноручно описывать физические явления понятным для себя языком, но вот, из данного примера, видно, что не так уж всё и понятно
__________________
(Offline)
 
Ответить с цитированием
Старый 09.11.2012, 16:44   #14
Devilox
ПроЭктировщик
 
Аватар для Devilox
 
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений
(для 9 пользователей)
Ответ: Отскок мяча

Ура!!! Получилось!!! Код, конечно, плохой, но он работает(движение по координатам и гравитация):
Global player
Global cam
Global pln
Global gun
Global pivo
Global cube

Global v# = 0.5
Global g# = 0.005

Graphics3D 800,600,32,1
SetBuffer BackBuffer()

Const TYPE_PLANE = 1 
Const TYPE_SPHERES = 2

Type T_bullets
	Field ent
	Field old_x#
	Field old_y#
	Field old_z#
	Field xspeed#
	Field yspeed#
	Field zspeed#
	Field m%
End Type

player = CreateSphere()
EntityType player,TYPE_SPHERES

cam = CreateCamera(player)

gun = CreateCylinder()
ScaleEntity gun,0.2,0.5,0.2
EntityColor gun,200,50,50
EntityParent gun,cam
PositionEntity gun,1.2,-0.8,1
TurnEntity gun,90,0,0

pivo = CreatePivot()
EntityParent pivo,gun
PositionEntity pivo,0,1,0

pln = CreatePlane()
PositionEntity pln,0,-2,0
EntityColor pln,50,150,150
EntityType pln,TYPE_PLANE

cube1 = CreateCube()
EntityType cube1,TYPE_PLANE
EntityColor cube1,50,50,200
ScaleEntity cube1,2,2,1
PositionEntity cube1,0,-1,-5

cube2 = CreateCube()
EntityType cube2,TYPE_PLANE
EntityColor cube2,50,50,200
ScaleEntity cube2,2,2,1
PositionEntity cube2,0,-1,5

Collisions TYPE_SPHERES,TYPE_PLANE,2,1

HidePointer()

While Not KeyHit(1)

If MouseHit(1)
	CreateBullet()
EndIf

UpdateBullets()

If KeyDown(17) MoveEntity player,0,0,0.1
If KeyDown(31) MoveEntity player,0,0,-0.1
If KeyDown(30) MoveEntity player,-0.1,0,0
If KeyDown(32) MoveEntity player,0.1,0,0

TurnEntity player, 0, 0 -MouseXSpeed() * 0.1, 0
TurnEntity cam, MouseYSpeed() * 0.1, 0, 0			
MoveMouse GraphicsWidth() / 2, GraphicsHeight() / 2
RotateEntity cam, EntityPitch#(cam), 0, 0

UpdateWorld()
RenderWorld()

Flip

Wend

End

;---------------------------------------------------;

Function CreateBullet.T_bullets()
	ex_bul.T_bullets = New T_bullets
	ex_bul\ent = CreateSphere(6,pivo)	
	ScaleEntity ex_bul\ent,0.2,0.2,0.2
	EntityParent ex_bul\ent,0
	RotateEntity ex_bul\ent,0,0,0
	EntityType ex_bul\ent,TYPE_SPHERES
	EntityRadius ex_bul\ent,0.2,0.2
	
	ex_bul\old_x = EntityX(ex_bul\ent)
	ex_bul\old_y = EntityY(ex_bul\ent)
	ex_bul\old_z = EntityZ(ex_bul\ent)
	
	ex_bul\xspeed = v * Cos(-EntityPitch#(cam)) * Sin(-EntityYaw#(player))
	ex_bul\yspeed = v * Sin(-EntityPitch#(cam))
	ex_bul\zspeed = v * Cos(-EntityPitch#(cam)) * Cos(EntityYaw#(player))
	
	ex_bul\m = 1
	
	Return ex_bul
End Function

Function UpdateBullets()
	Local ex_bul.T_bullets
	
	For ex_bul = Each T_bullets
	
	If ex_bul\m = 1		
		MoveEntity ex_bul\ent,ex_bul\xspeed,ex_bul\yspeed,ex_bul\zspeed
		ex_bul\yspeed = ex_bul\yspeed - g
	EndIf
				
		If EntityCollided(ex_bul\ent,TYPE_PLANE)
			
			ex_bul\m = 0
			
			For c% = 1 To CountCollisions(ex_bul\ent)
				nx# = CollisionNX(ex_bul\ent,c)
				ny# = CollisionNY(ex_bul\ent,c)
				nz# = CollisionNZ(ex_bul\ent,c)
			
				If nz <> 0
					If ex_bul\zspeed > 0
						ex_bul\zspeed = ex_bul\zspeed * nz
					Else
						ex_bul\zspeed = ex_bul\zspeed * (-nz)
					EndIf
				EndIf
				
				If nx <> 0
					If ex_bul\xspeed > 0
						ex_bul\xspeed = ex_bul\xspeed * nx
					Else
						ex_bul\xspeed = ex_bul\xspeed * (-nx)
					EndIf
				EndIf
				
				If ny <> 0
					If ex_bul\yspeed > 0
						ex_bul\yspeed = ex_bul\yspeed * ny
					Else
						ex_bul\yspeed = ex_bul\yspeed * (-ny)
					EndIf
				EndIf

				ex_bul\m  = 1
			Next
				
		EndIf
	Next
End Function
__________________

Последний раз редактировалось Devilox, 11.11.2012 в 13:50. Причина: Разобрался :)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
CRASHER (19.12.2013)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com