วิธีการทำให้เคลื่อนไหว 2d นามธรรมลงบนผิวน้ำ?


24

ขณะนี้ฉันใช้เกมที่มีมุมมองจากบนลงล่างของมหาสมุทร ฉันใช้สิ่งต่อไปนี้เป็นพื้นผิวที่เป็นนามธรรมเล็กน้อย:ป้อนคำอธิบายรูปภาพที่นี่

พื้นผิวที่แท้จริงมีความโปร่งใสฉันเพิ่มสีเขียวเหมือนเพื่อความชัดเจน

ปัญหาที่ฉันมีอยู่ในตอนนี้คือฉันไม่รู้ว่าจะทำให้พื้นผิวนี้เคลื่อนไหวอย่างไรดังนั้นน้ำจึงดูดี ฉันพยายามย้ายพื้นผิวด้วยคลื่นบาป: texture.y += sin(angle). แน่นอนว่าตอนนี้พื้นผิวทั้งหมดกำลังเคลื่อนไหวซึ่งดูไม่สมจริง สิ่งต่อไปที่ฉันพยายามคือเพิ่มเลเยอร์อื่นและใช้เอฟเฟกต์พารัลแลกซ์ ดังนั้นการสะท้อนกลับภายใต้ผิวน้ำก็จะเคลื่อนไหวเช่นกัน แต่ช้ากว่ามาก มันดูดีขึ้นเล็กน้อย แต่ก็ยังไม่ ... ดีพอ

ฉันคิดว่าอนิเมชั่นที่ดูดีที่สุดน่าจะเป็นถ้าแต่ละเซลล์จะขยายและหดตัวเช่นเว็บหรือผ้า ลองคิดดูว่าถ้าใครจะดึงจุดยอดหนึ่งของเซลล์เหล่านี้เล็กน้อยและเซลล์เพื่อนบ้านจะขยายตัวและเซลล์ที่ฉันดึงเข้าหา (หรือกดไปที่) จะหดตัว ชนิดของใยสปริง (?) แต่ฉันไม่มีเงื่อนงำวิธีการใช้สิ่งนี้:

  • แบบจำลองคณิตศาสตร์สำหรับเรื่องนี้คืออะไร? บางสิ่งบางอย่างกับสปริงแรงผลัก / ดึงอยู่ที่ไหน
  • และถ้าเป็นเช่นนั้นฉันจะแมปโมเดลนี้กับพื้นผิวที่กำหนดได้อย่างไร รักษาความโค้งทั้งหมดและสิ่งที่ไม่ ...

(ฉันยังเปิดรับความคิดที่แตกต่างกัน / คำตอบเกี่ยวกับวิธีการเคลื่อนไหวพื้นผิวที่กำหนดความสมจริงไม่ได้เป็นจุดที่นี่เพียงแค่น้ำดูดีเช่นการเคลื่อนไหว ... )

โซลูชันจาก DMGregory

ฉันโพสต์ตัวอย่าง libgdx ในโพสต์นี้: ภาพเคลื่อนไหวน้ำ 2d ขรุขระและไม่ราบรื่น (ดูคำตอบเกี่ยวกับการกรองพื้นผิว)

คำตอบ:


41

วิธีทั่วไปที่ทำได้คือการใช้การค้นหาพื้นผิวทางอ้อมใน shader เพื่อบิดเบือนพื้นผิวการแสดงผล:

gif แบบเคลื่อนไหวแสดงภาพเคลื่อนไหวน้ำ

ที่นี่ฉันใช้พื้นผิวที่มีสัญญาณรบกวนสีความถี่ต่ำ (การปูสีเรียบลื่นของสีแบบสุ่ม) และเลื่อนไปตามเรขาคณิตของจอภาพตลอดเวลา

ป้อนคำอธิบายรูปภาพที่นี่

แทนที่จะวาดสีจากพื้นผิวนี้ฉันจึงใช้ช่องสีแดงและสีเขียวและลบออก0.5fเพื่อเปลี่ยนเป็นเวกเตอร์ 2D ปลอมที่เปลี่ยนได้อย่างราบรื่นตลอดเวลาและพื้นที่

จากนั้นฉันสามารถเพิ่มเวกเตอร์นี้จำนวนน้อยลงในพิกัด UV ของฉันก่อนที่จะสุ่มตัวอย่างจากผิวน้ำหลัก สิ่งนี้จะเลื่อนส่วนของพื้นผิวที่เรากำลังอ่านและแสดงออกมาบิดดูรอบ ๆ

โดยการเฉลี่ยสองตัวอย่างจากเสียงนี้การเลื่อนไปในทิศทางตรงกันข้ามเราสามารถซ่อนทิศทางของการเคลื่อนที่ดังนั้นมันจึงดูเหมือนว่าไม่มีการเลื่อน

ใน Unity นั้น shader จะมีลักษณะเช่นนี้ - ควรง่ายพอที่จะแปลเป็นภาษา shader ที่คุณเลือก:

fixed4 frag (v2f i) : SV_Target
{               
    float2 waveUV = i.uv * _NoiseScale;
    float2 travel = _NoiseScrollVelocity * _Time.x;

    float2 uv = i.uv;
    uv += _Distortion * (tex2D(_Noise, waveUV + travel).rg - 0.5f);
    waveUV += 0.2f; // Force an offset between the two samples.
    uv += _Distortion * (tex2D(_Noise, waveUV - travel).rg - 0.5f);

    // Sample the main texture from the distorted UV coordinates.
    fixed4 col = tex2D(_MainTex, uv);

    return col;
}

1
มันดูดีจริงๆ ฉันไม่แน่ใจว่าฉันเข้าใจคุณลักษณะทั้งหมด: _NoseScale = scalar สำหรับการปรับ "แผนที่เสียง" _NoiseScrollVelocity = Vector2 ความเร็วที่เราเคลื่อนที่ข้ามแผนที่สัญญาณรบกวน _Noise =? _Distortion = Scalar ฉันเลือกเป็นปัจจัยการบิดเบือนหรือไม่ v2f = จุดสุดยอดที่เรากำหนดสี ฉัน =?
morpheus05

_Noiseคือ [ตัวอย่างเนื้อสัมผัสที่อ่านจาก] พื้นผิวแบบสุ่มเล็ก ๆ ของ blobby ด้านบน v2f iเป็นข้อมูลหยันจาก Shader จุดสุดยอด - i.uvเราส่วนใหญ่ใช้มันเพื่อให้ได้เนื้อพิกัดสำหรับพิกเซลที่เราวาดภาพกำลัง, และคุณถูกต้องเกี่ยวกับส่วนที่เหลือทั้งหมด
DMGregory

ฉันได้ติดตั้ง shader แล้ว แต่ก็ไม่ได้ผล (ไม่ขยับหรือผิดเพี้ยนไปใหญ่) ฉันคิดว่าฉันไม่ได้ตั้งค่าอย่างถูกต้อง เวลา = ความแตกต่างจากเฟรมสุดท้ายเป็นมิลลิวินาที noise_scale = 1 (ฉันใช้พื้นผิวของคุณโหมดการตัดซ้ำ) noise_scroll_velocity = [0.01, 0.01] การบิดเบือน = 0.02
morpheus05

โปรดทราบว่าตัวแปรนี้เรียกว่า Time ไม่ใช่ DeltaTime หากคุณใช้เวลาที่แตกต่างและ framerate ของคุณสอดคล้องกันคุณจะได้รับหมายเลขเดิมเสมอและคุณจะเรียกใช้ shader อีกครั้งด้วยอินพุตเดียวกันรับเอาต์พุตเดียวกัน (ไม่มีอะไรเคลื่อนไหว) ที่เลวร้ายยิ่งถ้า framerate ของคุณไม่สอดคล้องกันคุณจะได้รับการสั่นสะเทือนไปมา คุณต้องการให้เวลาทั้งหมดผ่านไปไม่ใช่เวลาเดลต้า
DMGregory

ไม่ช้าฉันก็กดปุ่มส่งฉันก็รู้แล้วและตอนนี้มันก็ใช้งานได้ ดูเหมือนว่าภาพเคลื่อนไหวจะตรึงคลื่นจากมุมขวาล่างและหลังจากนั้นประมาณ 10 วินาทีวินาทีนั้นก็จะจางหายไปเช่นเดียวกับคลื่นที่หยุด อะไรคือสาเหตุของสิ่งนี้
morpheus05

6

สิ่งนี้เรียกว่าเอฟเฟ็กต์ที่กัดกร่อนและการสร้างเอฟเฟกต์เหล่านี้ที่รันไทม์นั้นใช้เวลาค่อนข้างนานดังนั้นจึงเป็นการทำภาพเคลื่อนไหวแบบเฟรมต่อเฟรม มีเครื่องมือที่จะสร้างเฟรมแอนิเมชันสำหรับคุณเช่นCaustics Generatorซึ่งมีเวอร์ชันฟรีสำหรับการใช้ที่ไม่ใช่เชิงพาณิชย์ นอกจากนี้ยังมีบางอย่างที่ทำไว้ล่วงหน้าที่คุณสามารถซื้อในราคาที่ถูกกว่ารุ่นเครื่องมือที่ฉันกล่าวถึงอย่างมาก

โปรดทราบว่าโดยปกติแล้วเอฟเฟกต์การกัดกร่อนจะใช้เอฟเฟกต์เป็นคุกกี้แสงบนภูมิประเทศใต้น้ำหรือบนพื้นผิวใต้น้ำ นั่นคือการวางไว้บนพื้นผิวของน้ำในขณะที่มองลงไปไม่ปกติน้ำที่มีลักษณะ


นั่นเป็นเรื่องที่น่าสนใจมากฉันจะได้ดูที่ตัวสร้างนี้ (แม้ว่าฉันจะลองใช้ตัวแปร shader ถ้าฉันเข้าใจมัน ... )
morpheus05

4

ดูเหมือนว่าพื้นผิวที่คุณสามารถสร้างจากกราฟ voronoi เช่น:

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถทำการปรับกราฟขนาดเล็กและเรียบโดยการเลื่อนจุด การวาดกราฟใหม่แต่ละเฟรมจะค่อนข้างแพงดังนั้นคุณอาจต้องการแสดงภาพเคลื่อนไหวล่วงหน้า


4
ที่จริงแล้วฉันได้แสดงการกัดกร่อนด้วยวิธีนี้ใน shader ในอดีต ไม่จำเป็นต้องมีราคาแพงอย่างที่คิด ( นี่คือตัวอย่างการแสดงผล Voronoi edge แบบเรียลไทม์ใน WebGL shader ) แม้ว่าการทำให้รูปร่างที่ถูกต้องราบรื่นบนขอบ - แทนที่จะเป็นรูปหลายเหลี่ยมที่มีความท้าทาย
DMGregory

Ooo นั้นดีมาก ฉันมีเครื่องกำเนิดภูมิประเทศซึ่งมันมีประโยชน์มาก
FacticiusVir

0

มีวิธีการแบบเก่าที่เกี่ยวข้องกับชั้นพื้นผิวด้านล่างและพื้นผิวโปร่งใสสองครึ่งสำหรับการสะท้อนที่ด้านบน

หากคุณต้องการไปตลอดทางและต้องการให้น้ำดูไม่เต็มไปด้วยคลื่นโคลนหรือซุปบลูสีน้ำเงินแบบสามมิตินั่นคือเป้าหมาย

https://steamcdn-a.akamaihd.net/apps/valve/2010/siggraph2010_vlachos_waterflow.pdf


3
แม้ว่าลิงก์อาจช่วยได้ แต่ก็ไม่เคยตอบคำถามที่ดีเลย คุณสามารถขยายวิธีการทั้งสองนี้ได้หรือไม่? การดำเนินการเกี่ยวกับการนำไปใช้จะเป็นอย่างไร
Vaillancourt

วิธีแรกนั้นโดยทั่วไปเป็นวิธีการที่เก่าแก่มากที่ใช้ในการทำน้ำให้เคลื่อนไหว - คุณใช้พื้นผิวชั้นน้ำที่มีพิกัด UVW เปลี่ยนไปในทิศทางที่คุณเลือก ตอนนี้คุณใช้นอกเหนือจากแผนที่ปกติ / bump-map ซึ่งคุณเปลี่ยนไปในทิศทางอื่นถ้าทำได้ดีนี่จะดูน่าเชื่อถือสำหรับแม่น้ำสายเล็ก ๆ มันมีข้อ จำกัด อย่างมากแม้ว่าจะเป็นแหล่งน้ำขนาดใหญ่ก็ตามสิ่งใดก็ตามที่คลื่น ressembling จะได้รับผลกระทบจากคลื่น ลิงก์อธิบายการใช้ flowmaps ที่ไกลกว่านั้นฉันก็ทำได้
Pica

โปรดใช้คุณสมบัติแก้ไขเพื่อปรับปรุงคำถามด้วยสิ่งที่คุณเพิ่มไว้ที่นี่ :) ผู้คนมักจะใช้เพื่อค้นหาคำตอบในโพสต์ไม่ใช่ในความคิดเห็น
Vaillancourt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.