Zergatul Posted December 19, 2021 Share Posted December 19, 2021 It is simple task when View Bobbing is disabled. In RenderWorldLastEvent I do this: Vector3d view = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); MatrixStack stack = event.getMatrixStack(); stack.translate(-view.x, -view.y, -view.z); GL11.glPushMatrix(); RenderSystem.multMatrix(stack.last().pose()); double centerX = view.x; double centerY = view.y; double centerZ = view.z; double drawBeforeCameraDist = 1; double pitch = (mc.player.xRot) * Math.PI / 180; double yaw = (mc.player.yRot) * Math.PI / 180; centerX -= Math.sin(yaw) * Math.cos(pitch) * drawBeforeCameraDist; centerZ += Math.cos(yaw) * Math.cos(pitch) * drawBeforeCameraDist; centerY -= Math.sin(pitch) * drawBeforeCameraDist; But when I enabled View Bobbing, the center point starts moving in half-circle trajectory. I looked into GameRenderer class, bobView method. It calculates few float values and applies them to MatrixStack. I don't know if I can use this matrix (it comes in RenderWorldLastEvent), so I copied code from bobView and started experimentation. This is the best I can get: // omitted same lines from my first example double centerX = view.x; double centerY = view.y; double centerZ = view.z; double deltaXRot = 0; double deltaZRot = 0; double translateX = 0; double translateY = 0; if (mc.options.bobView && mc.getCameraEntity() instanceof PlayerEntity) { PlayerEntity playerentity = (PlayerEntity)mc.getCameraEntity(); float f = playerentity.walkDist - playerentity.walkDistO; float f1 = -(playerentity.walkDist + f * event.getPartialTicks()); float f2 = MathHelper.lerp(event.getPartialTicks(), playerentity.oBob, playerentity.bob); translateX = (double)(MathHelper.sin(f1 * (float)Math.PI) * f2 * 0.5F); translateY = (double)(-Math.abs(MathHelper.cos(f1 * (float)Math.PI) * f2)); deltaZRot = MathHelper.sin(f1 * (float)Math.PI) * f2 * 3.0F; deltaXRot = Math.abs(MathHelper.cos(f1 * (float)Math.PI - 0.2F) * f2) * 5.0F; } double drawBeforeCameraDist = 1; double yaw = (mc.player.yRot) * Math.PI / 180; double pitch = (mc.player.xRot + deltaXRot) * Math.PI / 180; centerY -= translateY; centerX += translateX * Math.cos(yaw); centerZ += translateX * Math.sin(yaw); centerX -= Math.sin(yaw) * Math.cos(pitch) * drawBeforeCameraDist; centerZ += Math.cos(yaw) * Math.cos(pitch) * drawBeforeCameraDist; centerY -= Math.sin(pitch) * drawBeforeCameraDist; Now center point doesn't jump to the right and left on the screen. And it doesn't jump up and down, but only if I look straight forward. As pitch angle goes far from 0 (either to -90 or 90), center point jumps harder up and down. Is my approach right? Or should I learn about MatrixStack and try to use it? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.