У меня проблема с обнаружением конфликтов, которую я создавал для 3D-вещи, которую я делаю.3D обнаружение столкновений не работает должным образом
Способ обнаружения столкновения: сначала я храню старые координаты xyz в переменных, затем вызываю функцию перемещения, а затем функцию столкновения. Если после движения произошло столкновение, камера - как в проигрывателе (на данный момент) - вернется к старым координатам x y z.
Я хочу, чтобы персонаж мог «скользить» вдоль стороны куба, так что, если вы столкнетесь с осью x, вы все равно можете скользить вдоль оси z. Однако на углу персонаж полностью останавливается - потому что есть столкновение x и z. Я решил сделать отдельные переменные для столкновений z и x, чтобы это не произошло, но теперь я могу попасть внутрь куба, когда я нахожусь на углу, но только на оси X. Я понятия не имею, как это исправить, я пробовал разные вещи (например, последнюю переменную в коде), и я просто не могу это понять. Помощь была бы оценена. Вот соответствующая часть кода:
def otherCollision(self,x,y,z):
print(float(Camera.x))
xcol = 0
zcol = 0
latest = 0
if (-Camera.x >= cubez[0][0] - 1) and \
(-Camera.x <= cubez[0][0] + cubez[0][3] + 1) and \
(-Camera.z >= cubez[0][2] - 1) and \
(-Camera.z <= cubez[0][2] + cubez[0][5] + 1):
if (-Camera.x >= cubez[0][0] - 1) and \
(-Camera.x <= cubez[0][0]) or \
(-Camera.x <= cubez[0][0] - 1 + cubez[0][3] + 2) and \
(-Camera.x >= cubez[0][0] - 1 + cubez[0][3] + 1): #>
#Camera.x = x
xcol = 1
latest = 1
if (-Camera.z >= cubez[0][2] - 1) and \
(-Camera.z <= cubez[0][2]) or \
(-Camera.z <= cubez[0][2] - 1 + cubez[0][5] + 2) and \
(-Camera.z >= cubez[0][2] - 1 + cubez[0][5] + 1): #>=
#Camera.z = z
zcol = 1
latest = 2
if xcol == 1 and zcol == 0:
Camera.x = x
if zcol == 1 and xcol == 0:
Camera.z = z
if xcol == 1 and zcol == 1 and latest == 2:
Camera.x = x
if xcol == 1 and zcol == 1 and latest == 1:
Camera.z = z
Следует отметить, что cubez
имеет список внутри списка - первый индекс, номер объекта, а следующий индекс значение мы» ищу. Они, в порядке, x,y,z,width,height,depth
.
Я использую pyglet 1.2alpha, но я не думаю, что это очень актуально для сообщения, так как ясно, что проблема в моей логике.
Я буду отмечать его как правильный результат, если нет способа сделать это с тем, как я это делаю сейчас. Мне довольно интересно узнать, как это можно сделать, изменив координаты (система, которую я использую сейчас) - поскольку я читал, что многие игры обнаруживают столкновения, телепортируя игрока в предыдущие не сталкивающиеся координаты. – Arcticcu
Это немного томатный помидор, я думаю. В моем примере вы «телепортируете» игрока на новую позицию, и если он сталкивается, адаптируйте направление движения так, чтобы оно не столкнулось. Таким образом, «телепортирование» происходит также, но по-другому, что я считаю более предпочтительным: расчеты, которые вы делаете, - это временный объект вычисления. Затем 'pos' _allways_ указывает фактическое положение вашего актера вместо того, чтобы возвращать его в зависимости от некоторых условий. – jro
хорошо, спасибо. Я буду использовать это тогда – Arcticcu