public class Player extends GameItem { Vector3f playerTemp; public Player(String name) { super(name); this.setPosition(0, 5, 0); playerTemp = new Vector3f(0, 5, 0); }
Проблема следующая: Персонаж падает как бы на куб и останавливается, но когда я пытаюсь пройти с боку в него, то он проходит, а должен останавливаться, исправляю уже пару часов, ничего в голову не пришло, может ли кто-нибудь знающий как работают столкновения в 3д пространстве помочь мне?
P.S. если playerTemp.x = this.position.x; и playerTemp.z = this.position.z; переместить в конец, то он не двигается совсем после столкновения по y. Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
Сообщение отредактировал last2424 - Понедельник, 19 Декабря 2016, 19:24
А он и не должен по твоему коду останавливаться. Если игрок заходи с боку, то у него грубо устанавливаются координаты. То есть выглядит так: 1) Сдвинулся внутрь куба. 2) Записал значения в temp. 3)Сработал If и установил значения temp в позицию игрока.
Если пример в цифрах то: 1) x = 3 , y = 3 , z = 3 (он уже в кубе) 2) temp.x = x , temp.z = z (то есть вносим те же самые координаты,что внутри куба). Выходит temp.x = 3, temp.z = 3 3) x = temp.x , z = temp.z . Выходит x =3, z = 3. Что была проверка, что не было...
Тебе нужно хранить отдельно старые координаты от текущих. Попробуй перенести
Daemod, если перенести temp в else то он будет стоять всегда в том случае если не указан temp.y и он уже не присвоен в position.y, но в таком случае он начинает подпрыгивать вверх вниз, хоть и двигается. Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
Попробовал еще раз разобраться в твоем коде, но сломал мозг Примерно код у тебя работает так: 1) Прыгает на позицию. 2) Проверяет можно ли было прыгнут туда. 3) Прыгает обратно, если было нельзя.
Я бы сделал так: 1) Проверяю можно ли прыгать. 2) Прыгаю если можно.
public class Player extends GameItem { Vector3f playerTemp; GameItem[] gameItems; public Player(String name) { super(name); this.setPosition(0, 5, 0); playerTemp = new Vector3f(0, 5, 0); }
public void update(GameItem[] gameItems, Camera camera, float delta) { System.out.println(this.getPosition() + ", " + playerTemp); this.setRotation(camera.getRotation().x, camera.getRotation().y, camera.getRotation().z); camera.setPosition(this.getPosition().x, this.getPosition().y, this.getPosition().z); this.gameItems = gameItems; playerTemp.x = this.position.x; playerTemp.y = this.position.y; playerTemp.z = this.position.z; } public boolean getCollision(float x, float y, float z){ for(int i = 0; i < gameItems.length; i++){ if(gameItems[i] != this && gameItems[i].name != "ZERO") { if((this.getPosition().x + x >= gameItems[i].getPosition().x -gameItems[i].getScale() && this.getPosition().x + x <= gameItems[i].getPosition().x+gameItems[i].getScale()) && (this.getPosition().y + y >= gameItems[i].getPosition().y -gameItems[i].getScale() && this.getPosition().y + y <= gameItems[i].getPosition().y+gameItems[i].getScale()*2) && (this.getPosition().z + z >= gameItems[i].getPosition().z -gameItems[i].getScale() && this.getPosition().z + z <= gameItems[i].getPosition().z+gameItems[i].getScale())){ return true; }else{ return false; } } } }
Daemod, так работать не будет. 1. Он не падает в твоём коде. 2. Он не будет двигаться после столкновения. 3. Проверять столкновения одновременно с движением - плохая идея, могу появится проблемы с самим передвижением. Лучшим вариантом остаётся хранить предыдущую позицию и в нужное время её заменять настоящей позицией. Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
Daemod, извини, теперь увидел, всё работает ) Теперь надо просто калибровки провести, ибо он может чуть дальше зайти и застрять там. т.е. если упереться вперёд в куб и нажать в бок, то он в нём застрянет) Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
Сообщение отредактировал last2424 - Вторник, 20 Декабря 2016, 18:27
Чтобы еще отдельно не создавать тему спрошу тут. Какой версии lwjgl пользуетесь? 3 или 2? Если на третей, то как устанавливали перспективную камеру? там вроде только ортогональная шла с фреймворком.
Daemod, 3, есть такая вещь как JOML(Java OpenGL Math Library), там хранится вся математика для создания перспективы, а в самом lwjgl 3 есть функция GL11.glLoadMatrix, которая загружает созданную матрицу. Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
Сообщение отредактировал last2424 - Вторник, 20 Декабря 2016, 20:54