Copyright © 2026 Dan Wilson
Ballistic Visualizer is an open-source tool licensed under the AGPL v3 open-source copyleft license. Any modification or redistribution must be distributed under the same license. The license agreement follows. Scroll to the bottom to agree to the license agreement.
Version 1.3.0 · 2026-11-06
Documentation
The Ballistic Visualizer is a tool for seeing which combinations of cartridge caliber and projectile are suitable for hunting a given game animal, while staying within several limits on projectile performance.
You enter values describing the game being hunted, the firearm, the projectile type, and the atmospheric conditions. The tool then computes the range of possible projectile weights, calibers and recommended muzzle velocities, and displays them as a 3-dimensional solid on a 3D graph. Any point inside the solid is a combination that satisfies every limit below. All calculation and drawing happen in your browser; nothing is sent to a server.
In addition, the solid is bounded by the edges of the graph: projectile weight 15–450 gr, caliber 0.170–0.500 in, and velocity 0–3500 fps.
The translucent solid is the set of acceptable combinations. If your inputs allow no combination at all, no solid is drawn and the readout in the lower left says “No feasible region for these inputs.” Otherwise that readout lists the solid’s extents on each axis, how much of the graph box it fills, and how many triangles were drawn.
| Action | Mouse | Touch screen |
|---|---|---|
| Rotate | Left-drag | One-finger drag |
| Pan (move the graph in the window) | Right-drag | Two-finger drag |
| Zoom | Mouse wheel | Pinch |
The View section of the controls also has Zoom in, Zoom out, Pan left/right/up/down, and Reset view buttons. Reset view returns to the starting angle and position.
The Inputs section of the controls box (upper right) holds the values that shape the solid. The solid is recomputed as you move each control.
| Control | Units | Range | Default | What it is |
|---|---|---|---|---|
| Game animal | pull-down menu | 38 animals, or User Weight | Whitetail Deer | The game animal being hunted. Choosing an animal (together with a size) fills in the game weight. See “Selecting the game animal and size” below. |
| Game size | pull-down menu | Small, Average, Large, or User Weight | Average | The size of the animal within its species. |
| Game weight | lb | 3 – 2200 | 230 (Whitetail Deer, Average) | Weight of the animal being hunted. Sets the minimum sectional density and minimum energy required. It is filled in by the animal and size menus, or you can drag the slider or type a weight. |
| Twist rate | in per turn | 3 – 16 | 8 | Inches of barrel travel per full rotation of the projectile (for example, 8 means 1:8). Affects stability and the maximum velocity allowed by the RPM limit. |
| Powder charge | grains | 3 – 125 | 43 | Weight of the powder charge. Contributes to recoil. |
| Muzzle brake | % efficiency | 0 – 100 | 75 | Efficiency of the muzzle brake. A higher value reduces recoil. Use 0 for no brake. |
| Recoil limit | ft-lbs | 5 – 60 | 22 | Maximum recoil energy you will accept. |
| Firearm weight | oz | 10 – 320 | 136 | Weight of the firearm as it will be shot. A heavier firearm recoils less. |
| Projectile type | pull-down menu | 3 choices | Jacketed Copper-Lead | Construction of the projectile. See the table below. |
| Ambient temp | °F | −40 – 120 | 80 | Air temperature. Affects the stability factor. |
| Altitude | feet above sea level | 0 – 14000 | 200 | Elevation of the hunt. Affects the stability factor through air pressure. |
The projectile type sets three values used by the calculations:
| Projectile type | Density term | Maximum RPM | Minimum velocity for expansion |
|---|---|---|---|
| Jacketed Copper-Lead | 0.409 | 300,000 | 1800 fps |
| Bonded Copper-Lead | 0.409 | 325,000 | 1800 fps |
| Copper Monolithic | 0.323 | 400,000 | 2200 fps |
The first three controls in the Inputs section set the game weight, and there are two ways to use them:
You can return to the table at any time by choosing an animal or a size again. If you choose an animal while the size shows User Weight, the size is set to Average (or to the last size you chose). If you choose a size while the animal shows User Weight, the last animal you chose is used. Choosing User Weight in either menu keeps the current weight and sets both menus to User Weight.
The game weight can range from 3 lb up to 2200 lb (Large Bison). Weights above 1250 lb are not well referenced; see section 4.
| Game animal | Small (lb) | Average (lb) | Large (lb) |
|---|---|---|---|
| Alaska Brown Bear | 180 | 740 | 1300 |
| Alaska Yukon Moose | 800 | 1200 | 1600 |
| American Badger | 10 | 22 | 33 |
| American Elk | 375 | 738 | 1100 |
| Barren-Ground Caribou | 150 | 240 | 330 |
| Beaver | 24 | 45 | 66 |
| Bighorn Sheep | 160 | 255 | 350 |
| Bison | 790 | 1495 | 2200 |
| Black Bear | 130 | 395 | 660 |
| Canadian Moose | 600 | 1095 | 1590 |
| Central Canada Barren-Ground Caribou | 250 | 350 | 450 |
| Columbian Blacktail Deer | 150 | 175 | 200 |
| Coues Deer | 60 | 80 | 100 |
| Cougar | 64 | 142 | 220 |
| Coyote | 18 | 31 | 44 |
| Dall Sheep | 130 | 215 | 300 |
| Desert Bighorn Sheep | 115 | 198 | 280 |
| Grizzly Bear | 180 | 940 | 1700 |
| Groundhog | 5 | 10 | 14 |
| Mountain Caribou | 400 | 500 | 600 |
| Mule Deer | 120 | 235 | 350 |
| Muskox | 400 | 650 | 900 |
| Polar Bear | 330 | 440 | 550 |
| Pronghorn Antelope | 75 | 108 | 140 |
| Quebec/Labrador Caribou | 200 | 300 | 400 |
| Rabbit | 3 | 5 | 6 |
| Raccoon | 11 | 19 | 26 |
| Red Fox / Gray Fox | 5 | 18 | 31 |
| Rocky Mountain Goat | 180 | 283 | 385 |
| Roosevelt Elk | 700 | 950 | 1200 |
| Shiras Moose | 600 | 900 | 1200 |
| Sitka Blacktail Deer | 80 | 140 | 200 |
| Stone Sheep | 150 | 185 | 220 |
| Tule Elk | 370 | 460 | 550 |
| Whitetail Deer | 150 | 230 | 310 |
| Wild Boar | 75 | 163 | 250 |
| Wolverine | 18 | 29 | 40 |
| Woodland Caribou | 300 | 350 | 400 |
The legend in the upper left, under the title, explains what each colored surface of the solid represents. It lists only the surfaces that actually form part of the solid’s boundary for the current inputs. Where a surface has a fixed numeric limit, the limit is shown in parentheses: the sectional density, the energy in ft-lbs, the recoil limit in ft-lbs, and the velocity limits in fps. The values update as you change the inputs. Surfaces named for the edge of the graph (for example “Weight ≤ 450 gr” or “Velocity ≥ 0 fps”) show where the solid is cut off by the range of the axes.
The Display section changes how the solid and graph are drawn. It does not change the calculation.
| Setting | Range / default | Effect |
|---|---|---|
| Solid opacity | 0 – 1, default 0.35 | How see-through the solid is. At low values you can see the marker point, plane and graph behind and inside the solid. At 1.00 the solid is fully opaque. |
| Color by surface | on / off, default on | On: each boundary surface has its own color, matching the legend. Off: the whole solid is a single color and the legend is hidden. |
| Solid color | color picker | The single color used when Color by surface is off. |
| Show edges | on / off, default on | Draws thin white lines where two surfaces meet, making the outline of the solid easier to read. |
| Grid resolution | 32 – 128, default 64 | How finely the curved surfaces are sampled. Higher values give smoother surfaces but slower updates. Edges where surfaces meet stay sharp at any setting. The change applies when you release the slider. |
| Show mesh | on / off, default off | Overlays the triangle mesh used to draw the solid. |
| Show grid | on / off, default on | Shows faint grid lines on the floor and two back walls of the graph. |
| Show axes / labels | on / off, default on | Shows the graph box, axes, tick values and axis titles. |
The marker point lets you mark a candidate projectile on the graph and see whether it is inside the computed envelope. It appears as a yellow sphere, set with the Marker point / plane controls:
| Control | Units | Range | Default |
|---|---|---|---|
| Weight | grains | 15 – 450 | 130 |
| Caliber | inches | 0.170 – 0.500 | 0.264 |
| Velocity | fps | 0 – 3500 | 2860 |
Turning on Show plane draws a flat plane through the marker point, perpendicular to the axis chosen in Plane normal axis (at point): Projectile Weight, Caliber or Velocity. The plane sits at the marker’s value on that axis. For example, with the plane set to Caliber and the marker caliber at 0.264, the plane is at caliber 0.264.
The part of the plane that lies inside the solid is highlighted in a brighter color, with a white outline where it meets the solid’s boundary surfaces. This is the cross-section of the envelope at that plane.
The plane is especially useful when set to Caliber. The highlighted area then shows, for that single caliber, every combination of projectile weight and velocity that is acceptable: read the weight range along the X axis and the velocity range along the Z axis. Change the marker’s caliber to step through other calibers. Since the marker point always lies on the plane, the point is inside the envelope exactly when it sits within the highlighted area.
Inputs can be set by adding parameters to the page’s web address. Any parameter you leave out keeps its default. Numbers outside a control’s range are limited to that range, and unreadable values are ignored. Example:
BallisticVisualizer.html?w=400&t=9&pt=c&pw=180&cal=0.308&vel=2700&plane=caliber
| Parameter | Sets | Values |
|---|---|---|
ga | Game animal | An animal name from the table above, such as Whitetail Deer. Capitalization, spaces and punctuation are ignored, so whitetaildeer and whitetail-deer also work. |
gs | Game size | small, average or large (or s, a, l). If only one of ga and gs is given, the other defaults to Whitetail Deer or Average. |
w | Game weight | 3–2200 lb. If w is given it overrides ga and gs, and both menus show User Weight. |
t | Twist rate | 3–16 in per turn |
p | Powder charge | 3–125 gr |
b | Muzzle brake | 0–100 (percent) |
rl | Recoil limit | 5–60 ft-lbs |
f | Firearm weight | 10–320 oz |
pt | Projectile type | j = Jacketed Copper-Lead, b = Bonded Copper-Lead, c = Copper Monolithic |
temp | Ambient temperature | −40–120 °F |
alt | Altitude | 0–14000 ft |
pw | Marker weight | 15–450 gr |
cal | Marker caliber | 0.170–0.500 in |
vel | Marker velocity | 0–3500 fps |
marker | Show the marker point | 1 or 0 |
plane | Show the plane, and its normal axis | weight, caliber, velocity, or none |
gui | Controls box | 0 hides it |
The minimum sectional density is computed from recommended sectional densities for different game weights, published by Chuck Hawks at https://www.chuckhawks.com/sd_vs_game_weight.htm.
The sectional densities in that source were plotted in Excel against game weight, and an equation was curve-fit to them. That equation is:
S = 0.0684 * w^0.2095
where w is the game weight in pounds and S is the minimum sectional density. For example, a 250 lb animal gives S ≈ 0.217.
A projectile’s own sectional density is its weight in pounds (grains divided by 7000) divided by the square of its caliber in inches. A weight and caliber combination meets this limit when its sectional density is at least S. Because heavier, narrower projectiles have higher sectional density, this limit appears as a surface that excludes light, wide projectiles from the solid.
The minimum energy is computed from data published on the Burris Optics website, listing ethical loads by game species:
As with sectional density, the data was plotted in Excel against game weight, and an equation was curve-fit to it. That equation is:
E = -0.0006 * w^2 + 2.8846 * w + 397.23
where w is the game weight in pounds and E is the minimum energy in foot-pounds (ft-lbs). For example, a 250 lb animal gives E ≈ 1081 ft-lbs.
A projectile’s energy is calculated from its weight and velocity, and a combination meets this limit when that energy is at least E. Heavier projectiles need less velocity to reach the required energy, so this limit appears as a surface that excludes slow, light projectiles from the solid.
The recoil felt by the shooter is computed using the physics rule that the total momentum of everything that leaves the firearm must equal the total momentum of the firearm itself, with the movement in the opposite direction.
There are three sources of momentum leaving the firearm:
The sum of all three sources is the total momentum that the firearm must reflect in the opposite direction. Once the total momentum is known, the firearm weight is used to compute the firearm’s rearward velocity, and from that velocity, the recoil energy. The tool uses these steps, with x the projectile weight (grains), z the velocity (fps), p the powder charge (grains), b the muzzle brake efficiency (as a fraction, 0 to 1) and f the firearm weight (oz):
| Quantity | Equation |
|---|---|
| Projectile momentum | m1 = (x / 7000) * z |
| Powder momentum | m2 = (p / 14000) * z |
| Jet effect momentum | m3 = 1.7 * (p / 7000) * z * (1 - b)^(1 / sqrt(e)) |
| Firearm rearward velocity (ft/s) | R1 = (m1 + m2 + m3) / (f / 16) |
| Recoil energy (ft-lbs) | R2 = R1^2 * (f / 16) / (2 * 32.17405) |
Momentum is expressed here as weight times velocity (with grains converted to pounds by dividing by 7000, and ounces to pounds by dividing by 16), so the gravitational constant cancels when dividing by the firearm weight. A combination of projectile weight and velocity is acceptable when its recoil energy R2 does not exceed the recoil limit you set.
How much recoil is too much? For most shooters, recoil above 15 ft-lbs of energy starts to get uncomfortable after several shots. Recoil above 22 ft-lbs causes most shooters to develop a flinch after several shots. The default recoil limit is 22 ft-lbs.
The jet effect and muzzle brakes. The jet effect is the majority contributor to recoil in high-velocity rifles. Muzzle brakes work by redirecting the depressurizing gases sideways, which eliminates the majority of the recoil from the jet effect. Muzzle brakes can reduce total recoil by up to 50%. Typical efficiencies for most rifle caliber muzzle brakes are from 75–80%, which is why the default muzzle brake setting is 75%. In the equation above, the brake efficiency b reduces only the jet effect term.