Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
Эмм... а разве игрок не смотрит всегда ровно посередине экрана?MrCreppo написал(а):В общем знаю что MovingObjectPosition - получение энтитя/блока на который например смотрит игрок. Теперь вопрос - нужно получить точку на экране, куда смотрит игрок(координаты в двухмерной плоскости). Как их получить?
Мне для 3 лица нужноFoghrye4 написал(а):Эмм... а разве игрок не смотрит всегда ровно посередине экрана?MrCreppo написал(а):В общем знаю что MovingObjectPosition - получение энтитя/блока на который например смотрит игрок. Теперь вопрос - нужно получить точку на экране, куда смотрит игрок(координаты в двухмерной плоскости). Как их получить?
//не стоит каждый раз создавать новый буфер, это чревато проблемами с производительностью
private static IntBuffer viewportBuf = BufferUtils.createIntBuffer(16);
private static FloatBuffer projectionBuf = BufferUtils.createFloatBuffer(16);
private static FloatBuffer modelviewBuf = BufferUtils.createFloatBuffer(16);
/**
* Метод использует текущие матрицу проекции и modelview матрицу, так что вызывать
* его во время отрисовки ГУИ - не дело. Вызывай в RenderWorldLastEvent, например
*/
public MovingObjectPosition calcBlockMouseOver(World world){
GL11.glGetInteger(GL11.GL_VIEWPORT, viewportBuf);
GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projectionBuf);
GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelviewBuf);
float vx = Mouse.getX();
// я не очень помню, где находится 0 по оси Y: сверху или снизу.
// если сверху, то vy = mc.displayHeight - Mouse.getY().
float vy = Mouse.getY();
// этот буфер не нативный, так что всё ОК
FloatBuffer resultBuf = FloatBuffer.allocate(3);
// В той статье предполагается ставить z на -1,
// но я не уверен, что оно будет правильно работать.
// Всё-таки миниальная глубина - это 0, а не -1. Решай сам, кому верить
Project.gluUnProject(vx, vy, -1, modelviewBuf, projectionBuf, viewportBuf, resultBuf);
Vec3 p1 = Vec3.createVectorHelper(resultBuf.get(0), resultBuf.get(1), resultBuf.get(2));
Project.gluUnProject(vx, vy, 1, modelviewBuf, projectionBuf, viewportBuf, resultBuf);
Vec3 p2 = Vec3.createVectorHelper(resultBuf.get(0), resultBuf.get(1), resultBuf.get(2));
//И всё бы ничего, но p1 и p2 центрированы то ли к камере, то ли к голове персонажа.
//Склоняюсь ко второму варианту. Поправим это.
p1 = p1.addVector(RenderManager.renderPosX, RenderManager.renderPosY, RenderManager.renderPosZ);
p2 = p2.addVector(RenderManager.renderPosX, RenderManager.renderPosY, RenderManager.renderPosZ);
return world.clip(p1, p2);
}
Тогда это получение двумерных координат блока на экране игрока.MrCreppo написал(а):Было получение блока нажатием мыши из гуи
Тут нужно в обратную сторону
int xShift = Math.round(displayScaledWidth/100*(lastPlayerYaw - Minecraft.getMinecraft().renderViewEntity.prevRotationYaw));
int yShift = Math.round(displayScaledHeight/64*(lastPlayerPitch - Minecraft.getMinecraft().renderViewEntity.prevRotationPitch));
И каким образом найти эту точку?GloomyFolken написал(а):Эмм... Быстро - никак. Нужно как-то рейтрейсить от глаз игрока в направлении, куда он смотрит (а я даже не знаю, куда он в этом моде смотрит). Если я правильно понял, что тебе нужно, то самый простой вариант - отрендерить всю сцену с позиции игрока в направлении, найти точку, куда он смотрит. По этой точке найти координаты, куда попадает взгляд, и сделать проекцию этой точки на экран (через Project.gluProject(), например)
private static IntBuffer viewportBuf = BufferUtils.createIntBuffer(16);
private static FloatBuffer projectionBuf = BufferUtils.createFloatBuffer(16);
private static FloatBuffer modelviewBuf = BufferUtils.createFloatBuffer(16);
....
int xShift = 0;
int yShift = 0;
if(mc.objectMouseOver!=null)
{
GL11.glGetInteger(GL11.GL_VIEWPORT, viewportBuf);
GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projectionBuf);
GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelviewBuf);
FloatBuffer resultBuf = FloatBuffer.allocate(3);
Project.gluProject((float)mc.objectMouseOver.hitVec.xCoord, (float)mc.objectMouseOver.hitVec.yCoord, (float)mc.objectMouseOver.hitVec.zCoord, modelviewBuf, projectionBuf, viewportBuf, resultBuf);
xShift = Math.round(resultBuf.get(0));
yShift = Math.round(resultBuf.get(1));
}
в каком смысле? Например так?:GloomyFolken написал(а):Нууу, передавать в gluProject явно нужно не координаты относительно центра мира, а координаты относительно позиции персонажа.
//xCoord
mc.objectMouseOver.hitVec.xCoord-player.posX
Делаю так:GloomyFolken написал(а):Угу, только по оси Y считать надо от глаз. Проще вычитать RenderManager.renderPosX/Y/Z
Project.gluProject((float)(mc.objectMouseOver.hitVec.xCoord-RenderManager.renderPosX), (float)(mc.objectMouseOver.hitVec.yCoord-RenderManager.renderPosY), (float)(mc.objectMouseOver.hitVec.zCoord-RenderManager.renderPosZ), modelviewBuf, projectionBuf, viewportBuf, resultBuf);
xShift = Math.round(resultBuf.get(0));
yShift = Math.round(resultBuf.get(1));
Кстати говоря player.posY - высота от глазOldestkon написал(а):>от глаз
Попробуй добавить\вычесть высоту глаз. Я хз какие значения там принимает renderPos, хотя по идее он должен бы брать позицию глаз как раз, судя по названию.