ฉันจะสร้างกราฟิกการ์ดแบบเคลื่อนไหวได้ใน Hearthstone ได้อย่างไร


9

ในเกม Hearthstone มีการ์ดที่มีภาพเคลื่อนไหวอยู่ด้วย ตัวอย่างบางส่วน:

  1. http://www.hearthhead.com/card=281/argent-commander
  2. http://www.hearthhead.com/card=469/blood-imp

ดูเหมือนว่าภาพเคลื่อนไหวจะประกอบด้วยเอฟเฟกต์หลายอย่าง:

  • ระบบอนุภาค
  • จางหายไปสไปรต์เข้าและออก / หมุนพวกเขา
  • พื้นผิวเลื่อนที่เรียบง่าย
  • เอฟเฟกต์การบิดเบือนชัดเจนมากในแหลมและผมของตัวอย่างที่ 1
  • เอฟเฟกต์การหมุนวนแสงในตัวอย่างที่ 1 และแสงสีเขียว / สีม่วงในตัวอย่างที่ 2

องค์ประกอบสามประการแรกนั้นเล็กน้อยสิ่งที่ฉันอยากรู้ก็คือวิธีที่สองสิ่งสุดท้ายสามารถทำได้ สามารถทำได้แบบเรียลไทม์ในเกมหรือภาพเคลื่อนไหวที่แสดงล่วงหน้าหรือไม่


1
อาจเป็นภาพเคลื่อนไหวที่บันทึกไว้ล่วงหน้าที่กำลังเล่นอยู่ในการ์ด ..
กริมชอฟ

คุณอาจมีโอกาสที่ดีกว่าในgraphicdesign.stackexchange.com cos ที่ดูเหมือน Photoshop หรือ AfterEffects ไม่ใช่การเรนเดอร์
Kromster

1
ฉันไม่แน่ใจว่าฉันเห็นด้วยกับการโยกย้ายคำถาม แต่ฉันมีคำถามติดตามสำหรับคุณ @Appeltaart: (1) คุณสนใจที่จะสร้างงานศิลปะหรือคุณสนใจรหัสที่แสดงผลงานศิลปะ ? (2) คุณถามว่าจะสามารถทำสิ่งนี้กับเกมเบราว์เซอร์ได้หรือไม่?

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

คำตอบ:


7

ฉันไม่รู้ว่ามันเกี่ยวข้องกันอีกหรือไม่ แต่คำตอบของดั๊กทำให้ถูกต้อง

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

Magni :

precision highp float;

uniform float uTime;
uniform sampler2D uSampler0;
uniform sampler2D uSampler1;
uniform sampler2D uSampler2;
uniform sampler2D uSampler3;
uniform sampler2D uSampler4;
uniform sampler2D uSampler5;
varying vec2 texCoords;

void main(void) {
  float t = uTime;
  vec3 mask = texture2D(uSampler1,texCoords).rgb;
  vec4 img = texture2D(uSampler0,texCoords);
  img.rg*=1.1;
  vec2 flow = texture2D(uSampler3,texCoords).gr;
  flow.y+=t*3.;
  vec4 plas = texture2D(uSampler2,flow*1.2) * mask.r;
  plas *= 15.5;
  plas *= vec4(0.239, 0.224,0.488,1.);
  vec2 ct = texCoords;
  ct.y -=t*0.5;
  vec4 clouds = texture2D(uSampler4,ct*2.);
  float clouds_a = clouds.a;
  clouds *= 4.5;
  clouds *= vec4(0.275,0.23,0.161,1.);
  clouds_a *= mask.b;
  img += clouds * mask.b;
  img += plas * mask.r ;
  img += (sin(t*15.)+1.) * mask.g * vec4(0.239, 0.224,0.488,1.)*2.;
  ct.x += t * 0.5;
  vec4 clouds_overall = texture2D(uSampler5,ct  * 0.5);
  clouds_overall *= vec4(0.275,0.23,0.161,1.);
  gl_FragColor = img +clouds_overall;
}

Medivh :

precision highp float;

uniform float uTime;
uniform sampler2D uSampler0;
uniform sampler2D uSampler1;
uniform sampler2D uSampler2;
uniform sampler2D uSampler3;
uniform sampler2D uSampler4;
uniform sampler2D uSampler5;
varying vec2 texCoords;

void main(void) {
  float t = uTime;
  vec2 tc = texCoords;
  tc.x-=t*2.;
  vec4 mask = texture2D(uSampler1,texCoords);
  float bump = texture2D(uSampler4,tc*0.5).r; 
  vec4 img = texture2D(uSampler0,vec2(texCoords.x,texCoords.y+bump* 0.055 * mask.g));
  tc = texCoords;
  tc.x-=0.05;
  tc.y+= 0.05;
  vec2 flow = texture2D(uSampler3,tc).rg;
  flow.y+=t;
  flow.y*=2.;
  vec4 plasma = texture2D(uSampler2,flow*1.5);
  plasma.rgb *= vec3(0.52,0.26,0.54);
  plasma *= 3.;
  flow = texture2D(uSampler5,texCoords).rg;
  flow.g+=t;
  vec4 plasma2 = texture2D(uSampler2,flow);
  plasma2 *= 4.;
  plasma2.rgb *= vec3(0.52,0.26,0.54);
  gl_FragColor =img+plasma*mask.r+bump*mask.a*0.35+plasma2*mask.b;
}

นี่คือสิ่งที่ฉันกำลังมองหาขอบคุณ! คุณเรียนรู้เทคนิคนี้ที่ไหนมันเรียกว่า (พลาสมา) และมีแหล่งข้อมูลเพิ่มเติมใดอีกบ้าง (หนังสือ / บทความ)
Appeltaart

2
จริง ๆ แล้วฉันคิดออกเองมันคล้ายกับจุดยอดในการเรนเดอร์ 3D แต่คุณเล่นไปรอบ ๆ โดยตรงด้วยพิกเซลที่พวกมันใช้แทน มีเทคนิคที่แตกต่างกันสองอย่างในการเล่นส่วนใหญ่เป็นแบบพื้นฐานสิ่งที่ฉันคิดว่าคุณกำลังมองหาเรียกว่า Displacement Mapping เป็นที่รู้จักกันโดยทั่วไปว่าการใช้พื้นผิวเพื่อย้าย / แทนที่จุดยอด แต่ที่นี่ฉันใช้พื้นผิวเพื่อ แทนที่พื้นผิวอื่นเพื่อให้ได้เอฟเฟกต์ลม
Daniel Mendel

เฮ้แดน! คุณมีสินทรัพย์ดั้งเดิมที่คุณใช้โพสต์ทุกที่หรือไม่? ลิงก์สาธิตของคุณไม่ทำงานในขณะนี้และเครื่อง wayback ดูเหมือนจะไม่แคชรูปภาพ ฉันมีคำตอบของคุณที่คั่นไว้สำหรับสักครู่ แต่ไม่เคยลงทุนเวลาศึกษานี้
แบรนดอนซิลวา

Woot! ฉันใช้ httrack เพื่อบันทึกไฟล์เมื่อหลายปีก่อน พบพวกเขา! เมื่อได้รับอนุญาตจากคุณฉันจะโพสต์ไว้ที่ใดที่หนึ่งหรือฉันสามารถส่งไฟล์ได้หากคุณไม่มีพวกเขาอีกต่อไปและคุณสามารถบันทึกไว้ใน repo หรืออะไรก็ได้
แบรนดอนซิลวา

@BrandonSilva ใช่คุณสามารถโพสต์พวกเขาว่าจะดี
Daniel Mendel

4

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

เทพดานิเมชั่น

  1. สร้างภาพเคลื่อนไหวโดยใช้เครื่องมือเช่น Photoshop และ After Effects
  2. เรนเดอร์เฟรมทีละเฟรมเป็นแอตลาส (แผ่นสไปรต์)
  3. ใช้ภาพเคลื่อนไหวตามรหัส
  4. แสดงเลย์เอาต์ของการ์ดโดยใช้การปิดบังที่เหมาะสมหรือพื้นหลังโปร่งใสหากต้องการ

ภาพเคลื่อนไหววิดีโอ

  1. สร้างภาพเคลื่อนไหวโดยใช้เครื่องมือเช่น Photoshop และ After Effects
  2. ส่งออกวิดีโอนั้นเป็นรูปแบบที่สามารถอ่านได้โดยโปรแกรมเกม
  3. เล่นภาพเคลื่อนไหวตามรหัส
  4. แสดงเลย์เอาต์การ์ดที่ด้านบนของวิดีโอโดยใช้มาสก์ที่เหมาะสมหรือพื้นหลังโปร่งใสหากจำเป็น

ภาพเคลื่อนไหวในเครื่องยนต์

  1. สร้างสินทรัพย์ทั้งหมดสำหรับภาพเคลื่อนไหวโดยใช้เครื่องมือเช่น Photoshop
  2. สร้างรูปแบบการ์ดภายในเครื่องยนต์โดยใช้ทรัพย์สินทั้งหมดที่จำเป็น
  3. เคลื่อนไหวโดยใช้เอ็นจิ้นโดยใช้แอนิเมชั่นแก้ไขที่กำหนดเองและบันทึกไว้
  4. เล่นภาพเคลื่อนไหวตามรหัสเมื่อจำเป็น

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

ในกรณีเช่นนี้วิธีที่ง่ายที่สุดน่าจะเป็นวิธีที่เหมาะสม


1
  • วิธีหนึ่งในการทำเช่นนั้นก็คือใช้วิดีโอแทนพื้นผิว วิดีโอนั้นจะต้องเตรียมล่วงหน้าและจะต้องวนซ้ำ

  • อีกวิธีคือการให้ฉาก "ตัวละคร, อนุภาค, การเคลื่อนที่เคปปิ้ง" ทั้งหมดกลายเป็นบัฟเฟอร์ซึ่งต่อมาในการเรนเดอร์เฟรมจะถูกนำมาใช้แทนที่พื้นผิว

ฉันไม่มีประสบการณ์เกี่ยวกับวิธีการแก้ปัญหาทั้งสองนี้ในเครื่องมือ 3D แต่ฉันคิดว่าทั้งสองเป็นไปได้ในเครื่องมือ 2D (ฉันคิดว่าฉันสามารถทำงานใน MOAI ได้เป็นตัวอย่าง)


1

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

โดยรวมแล้วพวกเขาไม่ได้มีผลกระทบราคาแพง พวกเขาไม่ดีเท่าที่พวกเขามองแวบแรก


การอ้างอิง 4 & 5 หมายถึงอะไร
Vaillancourt

"เอฟเฟกต์การหมุนวนแสงในตัวอย่างที่ 1 และแสงสีเขียว / สีม่วงในตัวอย่างที่ 2" ฉันเดาว่าเอฟเฟกต์การบิดเบือนอาจเป็นภาพเคลื่อนไหวกระป๋องของการย้ายจุดยอดหรือขั้นตอนหนึ่งที่เปลี่ยนแปลงพวกเขาในขณะทำงาน หรืออาจเป็น shader ที่มีอคติตัวอย่างเนื้อสัมผัสที่แนะนำโดยพื้นผิวการเลื่อน UV ครั้งที่สอง
Doug

0

เอฟเฟ็กต์เกือบทั้งหมดสามารถทำได้ด้วยเครื่องมือแอนิเมชั่นโครงกระดูก 2 มิติเช่น Spine สไปรท์นั้นเป็นพื้นผิวของตาข่าย 2 มิติ จากนั้นตาข่ายจะถูกเปลี่ยนเพื่อให้แหลมเคลื่อนย้ายเป็นต้น
ลองดูตัวอย่างของเอฟเฟกต์ดังกล่าว http://esotericsoftware.com/spine-in-depth#Featuresมี runtimes สำหรับเอ็นจิ้น / ภาษาส่วนใหญ่ เครื่องมือที่คล้ายกันคือ Spriter: http://www.brashmonkey.com

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