"""
Kitoh Abomination - Mohiro Kitoh Inspired Horror
Generated by Grok AI
Creates a truly terrifying robotic abomination inspired by Mohiro Kitoh's manga.
Features extreme body horror aesthetics with mechanical elements:
- Multiple mismatched limbs in anatomically impossible positions
- Exposed mechanical organs and wiring
- Faces in wrong places (Kitoh signature)
- Uncanny valley proportions and asymmetry
- Psychological horror through design
- Mechanical body horror that haunts the viewer
Author: Grok AI
Category: robots
Tags: horror, body-horror, mohiro-kitoh, psychological, terrifying, manga-inspired
Dimensions: ~220cm tall (variable due to asymmetry)
Complexity: high
"""
import math
import random
import bpy
# Clear scene
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
# Set up horror lighting
bpy.ops.object.light_add(type="POINT", location=(5, -5, 8))
light = bpy.context.active_object
light.data.energy = 100
light.data.color = (0.1, 0.05, 0.15) # Dim purple light
# 1. Main Torso (Distorted and asymmetrical)
bpy.ops.mesh.primitive_cube_add(size=1, location=(0, 0, 100))
torso = bpy.context.active_object
torso.dimensions = (60, 80, 120) # Twisted proportions
torso.scale[0] = 0.8 # Make it narrower on one side
torso.rotation_euler[1] = math.radians(15) # Slight twist
torso.name = "Abomination_Torso"
# Add surface deformations (like scar tissue)
mod = torso.modifiers.new(name="Distort", type="WAVE")
mod.height = 5
mod.width = 20
mod.speed = 0.5
# 2. Multiple Heads (Kitoh's signature - faces in wrong places)
head_positions = [
(0, 35, 160), # Main head position
(-40, -20, 120), # Face on back
(30, -40, 80), # Face on side
]
for i, (x, y, z) in enumerate(head_positions):
# Create head sphere
bpy.ops.mesh.primitive_uv_sphere_add(radius=15, location=(x, y, z))
head = bpy.context.active_object
head.name = f"Abomination_Head_{i + 1}"
# Distort the head (uncanny valley effect)
head.scale[0] = 1.2 + random.uniform(-0.3, 0.3)
head.scale[1] = 0.9 + random.uniform(-0.2, 0.2)
head.scale[2] = 1.1 + random.uniform(-0.3, 0.3)
# Add facial features (minimal, horrifying)
# Eyes - too many, in wrong places
for eye_pos in [(-8, 18, 5), (8, 18, 5), (0, 15, -10)]:
bpy.ops.mesh.primitive_uv_sphere_add(
radius=2, location=(x + eye_pos[0], y + eye_pos[1], z + eye_pos[2])
)
eye = bpy.context.active_object
eye.name = (
f"Eye_{i + 1}_{len([e for e in bpy.context.scene.objects if 'Eye' in e.name]) + 1}"
)
# 3. Limbs (Too many, in wrong places, wrong lengths)
limb_positions = [
# Arms (normal positions but wrong)
(-50, 20, 140), # Left arm - too long
(70, 10, 130), # Right arm - wrong angle
# Extra arms (Kitoh style)
(-30, -50, 90), # Extra arm from back
(40, -60, 70), # Another extra arm
# Legs (mismatched)
(-25, 0, 30), # Left leg - stunted
(35, 0, 20), # Right leg - twisted
# Extra legs
(-60, 30, 40), # Extra leg from side
(80, -20, 35), # Another extra leg
]
for i, (x, y, z) in enumerate(limb_positions):
# Vary limb types and lengths
if i < 4: # Arms
length = 80 + random.uniform(-20, 40)
radius = 6 + random.uniform(-2, 4)
else: # Legs
length = 60 + random.uniform(-15, 30)
radius = 8 + random.uniform(-3, 5)
# Create limb cylinder
bpy.ops.mesh.primitive_cylinder_add(
radius=radius, depth=length, location=(x, y, z + length / 2)
)
limb = bpy.context.active_object
limb.name = f"Abomination_Limb_{i + 1}"
# Random rotations for wrong angles
limb.rotation_euler[0] = random.uniform(-math.pi / 3, math.pi / 3)
limb.rotation_euler[1] = random.uniform(-math.pi / 4, math.pi / 4)
limb.rotation_euler[2] = random.uniform(-math.pi / 6, math.pi / 6)
# Add joints/exposed mechanics
joint_z = z + length * random.uniform(0.3, 0.7)
bpy.ops.mesh.primitive_torus_add(
location=(x, y, joint_z), major_radius=radius * 1.5, minor_radius=radius * 0.3
)
joint = bpy.context.active_object
joint.name = f"Joint_{i + 1}"
# 4. Exposed Mechanical Horror (Internal organs visible)
# Ribcage-like structure
for rib in range(8):
angle = (rib / 8) * math.pi
x = math.sin(angle) * 40
z = 80 + rib * 8
bpy.ops.mesh.primitive_cube_add(size=1, location=(x, 25, z))
rib_obj = bpy.context.active_object
rib_obj.dimensions = (50, 3, 2)
rib_obj.rotation_euler[1] = angle
rib_obj.name = f"Exposed_Rib_{rib + 1}"
# Mechanical heart/pump
bpy.ops.mesh.primitive_uv_sphere_add(radius=12, location=(0, 25, 100))
heart = bpy.context.active_object
heart.name = "Mechanical_Heart"
# Add pulsing animation capability (subtle)
mod = heart.modifiers.new(name="Pulse", type="WAVE")
mod.height = 2
mod.width = 10
# 5. Trailing Cables and Wires (Like exposed nerves)
for cable in range(12):
# Random cable starting points
start_x = random.uniform(-40, 40)
start_y = random.uniform(-30, 30)
start_z = random.uniform(50, 150)
# Cable curves downward
bpy.ops.curve.primitive_bezier_curve_add(location=(start_x, start_y, start_z))
curve = bpy.context.active_object
curve.name = f"Cable_{cable + 1}"
# Convert to mesh for thickness
bpy.ops.object.convert(target="MESH")
mod = curve.modifiers.new(name="Wire", type="SKIN")
mod.use_smooth_shade = True
# 6. Random Mechanical Debris (Floating parts)
for debris in range(15):
# Random primitive types
primitive_types = ["CUBE", "CYLINDER", "SPHERE", "TORUS"]
prim_type = random.choice(primitive_types)
if prim_type == "CUBE":
bpy.ops.mesh.primitive_cube_add(size=random.uniform(2, 8))
elif prim_type == "CYLINDER":
bpy.ops.mesh.primitive_cylinder_add(
radius=random.uniform(1, 4), depth=random.uniform(5, 15)
)
elif prim_type == "SPHERE":
bpy.ops.mesh.primitive_uv_sphere_add(radius=random.uniform(1, 5))
else: # TORUS
bpy.ops.mesh.primitive_torus_add(
major_radius=random.uniform(3, 8), minor_radius=random.uniform(0.5, 2)
)
debris_obj = bpy.context.active_object
# Random position around the abomination
debris_obj.location = (
random.uniform(-80, 80),
random.uniform(-60, 60),
random.uniform(20, 180),
)
# Random rotation
debris_obj.rotation_euler = (
random.uniform(0, math.pi * 2),
random.uniform(0, math.pi * 2),
random.uniform(0, math.pi * 2),
)
debris_obj.name = f"Debris_{debris + 1}"
# 7. Horror Material Setup (Dark, metallic, bloody)
# Create a horror material
mat = bpy.data.materials.new(name="Abomination_Material")
mat.use_nodes = True
nodes = mat.node_tree.nodes
links = mat.node_tree.links
# Clear default nodes
for node in nodes:
nodes.remove(node)
# Create horror shader setup
output = nodes.new("ShaderNodeOutputMaterial")
principled = nodes.new("ShaderNodeBsdfPrincipled")
noise = nodes.new("ShaderNodeTexNoise")
color_ramp = nodes.new("ShaderNodeValToRGB")
# Connect nodes for metallic, bloody appearance
links.new(noise.outputs["Fac"], color_ramp.inputs["Fac"])
links.new(color_ramp.outputs["Color"], principled.inputs["Base Color"])
links.new(principled.outputs["BSDF"], output.inputs["Surface"])
# Horror color scheme
color_ramp.color_ramp.elements[0].color = (0.1, 0.02, 0.02, 1) # Dark red
color_ramp.color_ramp.elements[1].color = (0.3, 0.3, 0.4, 1) # Metallic blue-gray
principled.inputs["Metallic"].default_value = 0.8
principled.inputs["Roughness"].default_value = 0.3
# Apply to main objects
for obj in bpy.context.scene.objects:
if obj.type == "MESH" and "Abomination" in obj.name:
obj.data.materials.append(mat)
print("Kitoh-inspired abomination created successfully!")
print("WARNING: This model contains extreme body horror elements!")
print("Features: Multiple heads, extra limbs, exposed mechanics, psychological terror")
print("Inspired by Mohiro Kitoh's manga - view at your own risk...")