// Wing-only Red Dragon reference-inspired scene (D&D-style silhouette) // Focus: watertight sealed wings with no gaps/holes; fast iteration #version 3.7; global_settings { assumed_gamma 1.0 max_trace_level 8 } #include "colors.inc" background { color rgb <0.78, 0.88, 1.00> } // ---------------- Camera ---------------- camera { location <0.0, 2.55, -9.8> look_at <0.0, 1.95, 1.35> angle 32 } // ---------------- Lights ---------------- light_source { <-12, 16, -14> color rgb <1.05, 0.98, 0.92> } light_source { < 14, 9, -10> color rgb <0.45, 0.55, 0.70> } light_source { < 0, 10, 8> color rgb <0.25, 0.25, 0.30> } #declare AMB = 0.06; // ---------------- Ground ---------------- plane { y, 0 texture { pigment { color rgb <0.62,0.64,0.62> } finish { diffuse 0.95 ambient AMB specular 0.04 roughness 0.10 } } } // ---------------- Textures ---------------- #declare Dragon_Scale_Normal = normal { average normal_map { [1.0 bumps 0.55 scale 0.10] [0.7 wrinkles 0.25 scale 0.45] } }; #declare Dragon_Red_Scales = texture { pigment { granite color_map { [0.00 rgb <0.28, 0.03, 0.03>] [0.30 rgb <0.52, 0.06, 0.06>] [0.60 rgb <0.76, 0.10, 0.08>] [1.00 rgb <0.95, 0.22, 0.12>] } scale 0.55 } normal { Dragon_Scale_Normal } finish { diffuse 0.85 ambient AMB specular 0.35 roughness 0.035 brilliance 1.4 } } #declare Wing_Membrane_Tex = texture { pigment { bozo color_map { [0.00 rgb <0.13, 0.01, 0.02>] [0.55 rgb <0.25, 0.03, 0.04>] [1.00 rgb <0.42, 0.06, 0.07>] } scale 0.65 } normal { average normal_map { [1.0 wrinkles 0.30 scale 0.40] [0.6 ripples 0.16 scale 0.14] } } finish { diffuse 0.90 ambient AMB specular 0.10 roughness 0.08 } } // ---------------- Helpers ---------------- #macro Bone(P1, P2, R1, R2) union { cone { P1, R1, P2, R2 texture { Dragon_Red_Scales } } sphere { P1, R1 texture { Dragon_Red_Scales } } sphere { P2, R2 texture { Dragon_Red_Scales } } } #end // Sealed watertight wing membrane as a single mesh2: // - front surface triangles // - back surface triangles (reversed winding) // - rim triangles sealing perimeter (front->back) #macro WingMembraneSealed(P0, P1, P2, F1, F2, TR, Thickness) #local T = Thickness; // Front points #local P0f = P0 + <0,0, T>; #local P1f = P1 + <0,0, T>; #local P2f = P2 + <0,0, T>; #local F1f = F1 + <0,0, T>; #local F2f = F2 + <0,0, T>; #local TRf = TR + <0,0, T>; // Back points #local P0b = P0 + <0,0,-T>; #local P1b = P1 + <0,0,-T>; #local P2b = P2 + <0,0,-T>; #local F1b = F1 + <0,0,-T>; #local F2b = F2 + <0,0,-T>; #local TRb = TR + <0,0,-T>; // Indices: // 0 P0f, 1 P1f, 2 P2f, 3 F1f, 4 F2f, 5 TRf, // 6 P0b, 7 P1b, 8 P2b, 9 F1b,10 F2b,11 TRb mesh2 { vertex_vectors { 12, P0f, P1f, P2f, F1f, F2f, TRf, P0b, P1b, P2b, F1b, F2b, TRb } uv_vectors { 12, <0.05,0.88>, <0.35,0.97>, <0.98,0.82>, <0.55,0.38>, <0.98,0.38>, <0.10,0.28>, <0.05,0.88>, <0.35,0.97>, <0.98,0.82>, <0.55,0.38>, <0.98,0.38>, <0.10,0.28> } face_indices { 48, // ---------- Front surface (8) ---------- <0,1,3>, // P0f P1f F1f <0,3,4>, // P0f F1f F2f <0,4,2>, // P0f F2f P2f <0,5,3>, // P0f TRf F1f <5,4,3>, // TRf F2f F1f <5,2,4>, // TRf P2f F2f <1,5,3>, // P1f TRf F1f <1,4,3>, // P1f F2f F1f // ---------- Back surface (8, reversed winding) ---------- <6,9,7>, // P0b F1b P1b <6,10,9>, // P0b F2b F1b <6,8,10>, // P0b P2b F2b <6,11,9>, // P0b TRb F1b <11,9,10>, // TRb F1b F2b <11,10,8>, // TRb F2b P2b <7,9,11>, // P1b F1b TRb <7,10,9>, // P1b F2b F1b // ---------- Rim seal (32 triangles) ---------- // Segment P0-P1 <0,1,7>, <0,7,6>, // Segment P1-F1 <1,3,9>, <1,9,7>, // Segment F1-TR <3,5,11>, <3,11,9>, // Segment TR-P0 <5,0,6>, <5,6,11>, // Segment P0-P2 <0,8,2>, <0,6,8>, // Segment P2-F2 <2,10,4>, <2,8,10>, // Segment F2-TR <4,11,5>, <4,10,11>, // Segment TR-P0 (duplicate edge closure is fine, but keep consistent) <5,6,0>, <5,11,6>, // Extra rim reinforcement around the leading edge chain P1-P2 (to prevent any tiny cracks // if points get edited later): add rim along P1->P2 as well, even though not in perimeter loop. // Segment P1-P2 <1,2,8>, <1,8,7>, // Extra rim along F1-F2 (often a visible edge) <3,4,10>, <3,10,9>, // Extra rim along F2-P2 <4,2,8>, <4,8,10>, // Extra rim along TR-P1 (small edge near shoulder) <5,1,7>, <5,7,11>, // Extra rim along TR-P2 (upper diagonal) <5,2,8>, <5,8,11>, // Extra rim along P0-F1 (inner edge) <0,3,9>, <0,9,6>, // Extra rim along P0-F2 (outer inner edge) <0,4,10>, <0,10,6>, // Extra rim along P0-TR (already present; add alternate winding support) <0,5,11>, <0,11,6> } texture { Wing_Membrane_Tex } } #end #macro DragonWing(SideSign) #local S = SideSign; // Classic D&D-ish batlike wing: strong leading edge, two finger points, swept back #local P0 = <0.95*S, 2.00, 1.25>; // shoulder root #local P1 = <2.75*S, 2.55, 1.05>; // elbow #local P2 = <6.10*S, 2.05, 1.55>; // main tip (extended) #local F1 = <3.65*S, 1.25, 2.85>; // inner finger point (lower) #local F2 = <6.25*S, 1.05, 2.55>; // outer finger point (lower) #local TR = <0.35*S, 1.10, 2.65>; // trailing root near body union { // Shoulder stub (context only, but helps attachment look continuous) sphere { P0, 0.22 texture { Dragon_Red_Scales } } cylinder { P0 + <0,0,0.00>, P0 + <0.00,-0.28,0.20>, 0.15 texture { Dragon_Red_Scales } } sphere { P0 + <0.00,-0.28,0.20>, 0.16 texture { Dragon_Red_Scales } } // Bones (share endpoints with membrane vertices) object { Bone(P0, P1, 0.125, 0.095) } // humerus object { Bone(P1, P2, 0.095, 0.060) } // leading edge object { Bone(P1, F1, 0.080, 0.052) } // finger 1 object { Bone(F1, F2, 0.062, 0.045) } // finger span object { Bone(F2, P2, 0.052, 0.034) } // outer finger to tip // Membrane (watertight) object { WingMembraneSealed(P0, P1, P2, F1, F2, TR, 0.020) } // Pose: sweep back, slightly up; mirror via S rotate <8, -14*S, 0> } #end // ---------------- Scene (wings only) ---------------- union { // Small torso mount for both wings (kept minimal, not a full dragon) union { sphere { <0.00, 1.55, 1.10>, 0.85 texture { Dragon_Red_Scales } } sphere { <0.00, 1.45, 2.05>, 0.70 texture { Dragon_Red_Scales } } cylinder { <0.00,1.52,1.15>, <0.00,1.42,2.20>, 0.48 texture { Dragon_Red_Scales } } } // Wings focus object { DragonWing(+1) } object { DragonWing(-1) } // Center and lift slightly off ground for clean shadow separation translate <0.0, 0.0, 0.85> }