今回は名探偵コナンの
緋色の弾丸シミュレーションです。


解説動画はこちら




緋色の弾丸

『名探偵コナン 緋色の弾丸』

2021年4月16日公開のアニメ映画で
劇場版『名探偵コナン』シリーズの24作目です。

映画の中ではリニアの超高速移動に合わせて
数キロ以上の距離から、動く犯人の狙撃に成功しているシーンがあります

この弾丸の到達距離のシミュレーションを行なっていきます。


最長狙撃記録

現代の主要な最長狙撃記録です。
1位:約4,000m(2024年、ウクライナ軍、Snipex Alligator)
2位:3,800m(2023年、ウクライナ軍、MCR Horizon's Lord)
3位:3,540m(2017年、カナダ軍、TAC-50)

現実世界では3-4キロの到達が限界だと思われます。




映画上の設定

映画上には狙撃を成功させるための
重要なポイントとなる設定がいくつかありました。
世界初の「真空トンネル」内を走行する超電導リニアで時速は約1000km
ライフル弾には特注の「銀の弾丸」が使用された

リニアも弾丸も時速1000kmで飛んだ設定
リニアが減速した際に、ライフル弾は減速しないので、そのまま犯人に命中した

つまりは真空状態のリニア線路上を銀の弾丸が飛んでいったというのが
重要なポイントです。


銀の弾丸使用のポイント


狙撃用の弾の素材が銀が最良かどうかは分かりませんが
銀である必要はあったようです。


高い導電性:
銀は金属の中で電気を通しやすい

レンズの法則(渦電流):
導体である銀が、リニアの強力な変動磁場の中を高速で移動すると
弾丸表面に強力な「渦電流」が発生

磁気反発:
この渦電流が、レールの磁場と反発する磁力(ローレンツ力)を
生み出し、弾丸を浮かせる 「揚力」 となる


ということで
リニア線路内は重力の影響を受けない弾丸になる
と仮定することにします。


射撃シミュレーター

重力 0 や真空の状況を加味したものです

通常射撃(空気抵抗、重力影響有り)
真空射撃(空気抵抗 0、重力影響有り)
リニア射撃(空気抵抗 0、重力影響 0)
の状態を選べます。

コードはこちら
import numpy as np
import matplotlib.pyplot as plt
from math import pi, cos, sin, sqrt

class BallisticSimulator:
    def __init__(self, dt=0.01):
        self.dt = dt
        self.g = 9.80665

    def get_accelerations(self, vx, vy, k, am):
        """
        現在の速度と設定から、x方向とy方向の加速度を返す
        k: 空気抵抗係数, am: 磁気浮上加速度
        """
        v = sqrt(vx**2 + vy**2)
        # x方向: 空気抵抗のみ
        ax = -k * vx * v
        # y方向: 重力(下) + 磁気浮上(上) + 空気抵抗(上下)
        ay = -self.g + am - (k * vy * v)
        return ax, ay

    def simulate(self, mode="normal", v0_kmh=1000.0, deg=0.0, ht=1.5, mas_g=9.0, area_cm2=0.5):
        # モードごとの環境設定
        config = {
            "normal":      {"rho": 1.225, "am": 0.0},      # 1. 通常(空気あり、浮力なし)
            "vacuum":      {"rho": 0.0,   "am": 0.0},      # 2. 真空(空気なし、浮力なし)
            "maglev":      {"rho": 0.0,   "am": 9.80665}   # 3. 真空 + 磁気浮上
        }
        env = config.get(mode, config["normal"])
        v0 = v0_kmh / 3.6
        rad = deg * pi / 180
        # 物理定数の計算
        mas = mas_g / 1000.0
        s_area = area_cm2 / 10000.0
        cd = 0.3
        k = 0.5 * s_area * cd * env["rho"] / mas
        # 初期値
        x, y = 0.0, ht
        vx, vy = v0 * cos(rad), v0 * sin(rad)
        res_x, res_y = [x], [y]
        for _ in range(1000000):
            k1vx, k1vy = self.get_accelerations(vx, vy, k, env["am"])
            k2vx, k2vy = self.get_accelerations(vx + k1vx*self.dt/2, vy + k1vy*self.dt/2, k, env["am"])
            k3vx, k3vy = self.get_accelerations(vx + k2vx*self.dt/2, vy + k2vy*self.dt/2, k, env["am"])
            k4vx, k4vy = self.get_accelerations(vx + k3vx*self.dt, vy + k3vy*self.dt, k, env["am"])
            vx += (k1vx + 2*k2vx + 2*k3vx + k4vx) / 6 * self.dt
            vy += (k1vy + 2*k2vy + 2*k3vy + k4vy) / 6 * self.dt
            x += vx * self.dt
            y += vy * self.dt
            if y < 0 or x >= 300000: break
            res_x.append(x)
            res_y.append(y)
        return res_x, res_y

# --- 実行と可視化 ---
sim = BallisticSimulator()
modes = ["normal", "vacuum", "maglev"]
mode = modes[1]

rx, ry = sim.simulate(mode=mode, v0_kmh=1000.0, deg=0)
print(f"飛行時間  : {(len(rx) - 1) * sim.dt:.2f} 秒")
print(f"移動距離  : {rx[-1]:.2f} メートル, {rx[-1]/1000:.5f} キロメートル")
plt.figure(figsize=(16, 3))
plt.plot(rx, ry, label=f"Mode: {mode}")
plt.axhline(0, color='black', linewidth=1)
plt.title("Comparison of Bullet Trajectories (v=1000km/h)")
plt.xlabel("Distance (m)")
plt.ylabel("Height (m)")
plt.legend()
plt.grid(True)
plt.show()
飛行時間  : 0.54 秒
移動距離  : 150.00 メートル, 0.15000 キロメートル

download-3

 真空状態であったとしても
水平に撃ったのでは150メートルほどしか飛びません。


上の方に向けて撃った場合はもう少し長い距離飛びます。

download-2

射角5度くらいで1400メーターくらいです。
全然届かないですね。
しかも高さ30メートルの高低差が出てしまうので
リニアトンネルの天井にぶつかって終わってしまいます。


しかし、重力の影響が無いと仮定すると

download
銀の弾丸はまっすぐ飛んでいけます。



まとめ


弾丸が重力の影響を受けない限定的な条件下であれば
シミュレーション上ではトンネルが真っ直ぐ続く限り
銀の弾丸はどこまでも飛んでいくと推測されます。

狙撃距離は100kmあたり(2分後くらい)になると推測される

銀の弾丸に浮力が付き
リニアの線路がマジで真っ直ぐだったら
あり得ないでもない(赤井さんなら)
というのが結論です。


製作陣がどれだけの考慮をしたかは分かりませんが
特殊条件下であれば不可能でも無いと思います。

そういえば
来週からコナンの新作映画が公開されますね!!

速攻見にいきましょう


PS:
個人的には
逆襲のシャアの決着を
コナンで付けてもらいたかったのですが
もう叶わないのですかね