User Tools

Site Tools


tutorial:pixel_raycast

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tutorial:pixel_raycast [2020/08/15 13:08] emmanuelmesstutorial:pixel_raycast [2023/11/30 22:33] (current) – [For arbitrary reach] Naming fix famrofexl
Line 34: Line 34:
 ==== For arbitrary reach ==== ==== For arbitrary reach ====
  
-The code above allows for the normal reach, 3 blocks for survival and 4.5 in creative. If you want the raycast to reach farther you need to use the general case belowExample [[https://github.com/EmmanuelMess/BoundingBoxMinecraftMod|here]].+The code above allows for the normal reach, 3 blocks for survival and 4.5 in creative. If you want the raycast to reach farther you need to replace <code java> HitResult hit = client.crosshairTarget;</code> in [[pixel_raycast#special_casecenter_pixel | Special CaseCenter Pixel]] with the example below: 
 + 
 +<code java [enable_line_numbers="true"]> 
 +double maxReach = 1000; //The farthest target the cameraEntity can detect 
 +float tickDelta = 1.0F; //Used for tracking animation progress; no tracking is 1.0F 
 +boolean includeFluids = true; //Whether to detect fluids as blocks 
 + 
 +HitResult hit = client.cameraEntity.raycast(maxReach, tickDelta, includeFluids); 
 +</code>
  
 ===== General case: Arbitrary pixel  ===== ===== General case: Arbitrary pixel  =====
 +
 +Example [[https://github.com/EmmanuelMess/BoundingBoxMinecraftMod|here]].
  
 For this one we need to precalculate a few things: For this one we need to precalculate a few things:
Line 77: Line 87:
 Then you have this reimplementation of the code at GameRenderer#updateTargetedEntity: Then you have this reimplementation of the code at GameRenderer#updateTargetedEntity:
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
-private static HitResult rayTraceInDirection(MinecraftClient client, float tickDelta, Vec3d direction) {+private static HitResult raycastInDirection(MinecraftClient client, float tickDelta, Vec3d direction) {
     Entity entity = client.getCameraEntity();     Entity entity = client.getCameraEntity();
     if (entity == null || client.world == null) {     if (entity == null || client.world == null) {
Line 84: Line 94:
  
     double reachDistance = client.interactionManager.getReachDistance();//Change this to extend the reach     double reachDistance = client.interactionManager.getReachDistance();//Change this to extend the reach
-    HitResult target = rayTrace(entity, reachDistance, tickDelta, false, direction);+    HitResult target = raycast(entity, reachDistance, tickDelta, false, direction);
     boolean tooFar = false;     boolean tooFar = false;
     double extendedReach = reachDistance;     double extendedReach = reachDistance;
     if (client.interactionManager.hasExtendedReach()) {     if (client.interactionManager.hasExtendedReach()) {
-        extendedReach = 6.0D;+        extendedReach = 6.0D;//Change this to extend the reach
         reachDistance = extendedReach;         reachDistance = extendedReach;
     } else {     } else {
Line 108: Line 118:
             .stretch(entity.getRotationVec(1.0F).multiply(reachDistance))             .stretch(entity.getRotationVec(1.0F).multiply(reachDistance))
             .expand(1.0D, 1.0D, 1.0D);             .expand(1.0D, 1.0D, 1.0D);
-    EntityHitResult entityHitResult = ProjectileUtil.rayTrace(+    EntityHitResult entityHitResult = ProjectileUtil.raycast(
             entity,             entity,
             cameraPos,             cameraPos,
Line 136: Line 146:
 } }
  
-private static HitResult rayTrace(+private static HitResult raycast(
         Entity entity,         Entity entity,
         double maxDistance,         double maxDistance,
Line 144: Line 154:
 ) { ) {
     Vec3d end = entity.getCameraPosVec(tickDelta).add(direction.multiply(maxDistance));     Vec3d end = entity.getCameraPosVec(tickDelta).add(direction.multiply(maxDistance));
-    return entity.world.rayTrace(new RayTraceContext(+    return entity.world.raycast(new RaycastContext(
             entity.getCameraPosVec(tickDelta),             entity.getCameraPosVec(tickDelta),
             end,             end,
-            RayTraceContext.ShapeType.OUTLINE, +            RaycastContext.ShapeType.OUTLINE, 
-            includeFluids ? RayTraceContext.FluidHandling.ANY : RayTraceContext.FluidHandling.NONE,+            includeFluids ? RaycastContext.FluidHandling.ANY : RaycastContext.FluidHandling.NONE,
             entity             entity
     ));     ));
Line 154: Line 164:
 </code> </code>
  
-Once you have the direction and the raytracer, you can put them together:+Once you have the direction and the raycaster, you can put them together:
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
 Vec3d direction = map( Vec3d direction = map(
Line 166: Line 176:
         height         height
 ); );
-HitResult hit = rayTraceInDirection(client, tickDelta, direction);+HitResult hit = raycastInDirection(client, tickDelta, direction);
  
 switch(hit.getType()) { switch(hit.getType()) {
Line 185: Line 195:
 </code> </code>
  
-Here x and y are you pixel coordinates.+Here x and y are your pixel coordinates.
  
 ==== Performance considerations ==== ==== Performance considerations ====
  
-This is EXPENSIVE, if you do it too many times, it WILL get slow. Especially for long reaches.+This is EXPENSIVE, if you do it too many times, it WILL get slow. Especially for long reaches. If you **need** to do many raycasts in a single frame, [[https://stackoverflow.com/q/777997/3124150|this]] link might be helpful.
tutorial/pixel_raycast.1597496922.txt.gz · Last modified: 2020/08/15 13:08 by emmanuelmess