рдпрд╣ рд▓реЗрдЦ рдЧреНрд▓реЛ рдЗрдлрд╝реЗрдХреНрдЯ рдкрд░ рдореЗрд░реА
рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ .3ds рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИрдВред
рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдпрд╛
Demo.design 3D рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ FAQ рдореЗрдВ рдкрдврд╝реА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рднреА рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ (рдФрд░ рдпрд╣ рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛), рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдо рдЬрд╛рд╡рд╛ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрднреНрдпрд╛рд╕, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛:
- рдкреВрд░реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдХрд╛рдлреА рддреЗрдЬ рд╣реИ (рдлреЛрди рдкрд░ рдПрдХ рджреЛ-рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдлрд╝рд╛рдЗрд▓ рдХреБрдЫ рд╕реЗрдХрдВрдб рдореЗрдВ рднрд░реА рд╣реБрдИ рд╣реИ);
- рдкреВрд░реЗ рдореЙрдбрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛, рдорд╛рдирджрдВрдбреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛, рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд▓реЛрдб рдХрд░рдирд╛;
- рд╕рд╛рдордЧреНрд░реА, рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА;
- рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдиреАрдореЗрд╢рди рдФрд░ рдкрджрд╛рдиреБрдХреНрд░рдо рд▓реЛрдб рдХрд░рдирд╛ред
рдпрд╣рд╛рдБ рдХреНрдпрд╛
рдирд╣реАрдВ рд╣реЛрдЧрд╛:
- рдЦреБрдж рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ (рдореБрдЭреЗ рдЕрднреА рддрдХ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ);
- рдХреИрдорд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ (рдлрд┐рд░ рд╕реЗ, рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рдерд╛);
рдорд╛рдирджрдВрдбреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЪреМрд░рд╕рд╛рдИ рд╕рдореВрд╣реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИ) (рдпрд╣ рдЕрднреА рднреА рд╣реЛрдЧрд╛);- рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрдмрд╛рдПрдВ, рдпрд╣рд╛рдВ рдореИрдВ рдирд╣реАрдВ (рдпрд╣ рдПрдХ рд╣рдЬрд╛рд░ рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ), рдореИрдВ рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб (рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ) рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛ред рдЕрднреА рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ? рддреЛ рдЪрд▓рд┐рдП рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред
рдлрд╝рд╛рдЗрд▓ рдкрдврд╝реЗрдВ
рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдпрд╣ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкрдврд╝рдирд╛ рдерд╛ рдЬреЛ рд╕рдмрд╕реЗ рдХрдард┐рди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛, рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдерд╛ред рдпрд╣рд╛рдВ рджреЛ рд░реЗрдХ рд╣реИрдВ: рдЧрддрд┐ рдФрд░ рд╢реБрджреНрдзрддрд╛ред рд╣рдо BufferedInputStream рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдкрдврд╝рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрддрд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ: рдЬрд╛рд╡рд╛ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛ рдмрдбрд╝реЗ-рдПрдВрдбрд┐рдпрди рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬрдмрдХрд┐ .3ds рдЫреЛрдЯреЗ-рдПрдВрдбрд┐рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЦреИрд░ ... рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
private BufferedInputStream file; private byte[] bytes = new byte[8]; private long filePos = 0; ... private void Skip(long count) throws IOException { file.skip(count); filePos += count; } private void Seek(long end) throws IOException { if (filePos < end) { Skip(end - filePos); filePos = end; } } private byte ReadByte() throws IOException { file.read(bytes, 0, 1); filePos++; return bytes[0]; } private int ReadUnsignedByte() throws IOException { file.read(bytes, 0, 1); filePos++; return (bytes[0]&0xff); } private int ReadUnsignedShort() throws IOException { file.read(bytes, 0, 2); filePos += 2; return ((bytes[1]&0xff) << 8 | (bytes[0]&0xff)); } private int ReadInt() throws IOException { file.read(bytes, 0, 4); filePos += 4; return (bytes[3]) << 24 | (bytes[2]&0xff) << 16 | (bytes[1]&0xff) << 8 | (bytes[0]&0xff); } private float ReadFloat() throws IOException { return Float.intBitsToFloat(ReadInt()); }
рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ, рдпрд╣ рдмрдлрд╝рд░рдб рдЗрдирдкреБрдЯрд╕реНрдЯреНрд░реАрдо рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдерд╛ред
рдЕрдм рдЖрдк рд╣рд┐рд╕реНрд╕рд╛ рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП - рдореБрдЦреНрдп рдПрдХ:
private Scene3D ProcessFile(long fileLen) throws IOException { Scene3D scene = null; while (filePos < fileLen) { int chunkID = ReadUnsignedShort(); int chunkLen = ReadInt() - 6; switch (chunkID) { case CHUNK_MAIN: if (scene == null) scene = ChunkMain(chunkLen); else Skip(chunkLen); break; default: Skip(chunkLen); } } return scene; } private Scene3D ChunkMain(int len) throws IOException { Scene3D scene = new Scene3D(); scene.materials = new ArrayList<Material3D>(); scene.objects = new ArrayList<Object3D>(); scene.lights = new ArrayList<Light3D>(); scene.animations = new ArrayList<Animation>(); long end = filePos + len; while (filePos < end) { int chunkID = ReadUnsignedShort(); int chunkLen = ReadInt() - 6; switch (chunkID) { case CHUNK_OBJMESH: Chunk3DEditor(scene, chunkLen); break; case CHUNK_KEYFRAMER: ChunkKeyframer(scene, chunkLen); break; case CHUNK_BACKCOL: scene.background = new float[4]; ChunkColor(chunkLen, scene.background); break; case CHUNK_AMB: scene.ambient = new float[4]; ChunkColor(chunkLen, scene.ambient); break; default: Skip(chunkLen); } } Seek(end); scene.Compute(0); return scene; }
рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдбрд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛рдлреА рд╕рдЬрд╛рддреАрдп рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдЪрдВрдХ рдХреЗ рд▓рд┐рдП - рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрди рдЙрдк-рд╡рд┐рдЦрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдЬреЛ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╣рдо рдЕрдирд╛рд╡рд╢реНрдпрдХ, - рдХреВрджрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВрдЧреЗ, рддреБрд░рдВрдд рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЪрд▓реЗ рдЬрд╛рдПрдВрдЧреЗред рдЕрд╡реИрдз рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рдВрд░рдХреНрд╖рдг рдпрд╣рд╛рдВ рдиреНрдпреВрдирддрдо рд╣реИред
рд╕рд╛рдордЧреНрд░реА
рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдмреНрд▓реЙрдХ рдЖрдорддреМрд░ рдкрд░ рдкрд╣рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрдм рддреНрд░рд┐рдХреЛрдг рдХрд╛ рдмреНрд▓реЙрдХ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдХрдИ рд░рдВрдЧ (рдкрд░рд┐рд╡реЗрд╢, рдлреИрд▓рд╛рдирд╛, рд╕реНрдкреЗрдХреНрдпреБрд▓рд░) рд╣реЛрддреЗ рд╣реИрдВ, рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдирд╛рдо, рдЪрдХрд╛рдЪреМрдВрдз рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░, рдмрдирд╛рд╡рдЯ рдХрд╛ рдирд╛рдоред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмрдирд╛рд╡рдЯ рдпрд╣рд╛рдВ рд▓реЛрдб рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред
3 рдбреА рдореЙрдбрд▓
рдкреНрд░рддреНрдпреЗрдХ 3D рдореЙрдбрд▓ (рджреЗрдЦреЗрдВ ChunkTrimesh рдлрд╝рдВрдХреНрд╢рди) рдирд┐рдореНрди рдбреЗрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- рд╢реАрд░реНрд╖ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рд╕реВрдЪреА;
- рддреНрд░рд┐рдХреЛрдг рдХреА рд╕реВрдЪреА;
- рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ;
- рд╕реНрдерд╛рдиреАрдп рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реАред
рдпрджрд┐ рдкрд╣рд▓реЗ рддреАрди рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рдХреБрдЫ рд░рд╣рд╕реНрдпрдордп рджрд┐рдЦрддрд╛ рд╣реИред рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рдХреА рдЗрдХрд╛рдИ рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рдЕрднреА рднреА рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╣рдо рдПрдХ рд╕рд░рдгреА рдлреНрд▓реЛрдЯ рдореЗрдВ рдХреЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдбрдВрдк рдХрд░реЗрдВрдЧреЗ [], рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдЖрда рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ (рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рджреНрд╡рд╛рд░рд╛ рддреАрди, рдкреНрд▓рд╕ рджреЛ рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ)ред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:
GLES20.glVertexAttribPointer(maPosition, 3, GLES20.GL_FLOAT, false, 32, 0); GLES20.glVertexAttribPointer(maNormal, 3, GLES20.GL_FLOAT, false, 32, 12);
рдпрд╣рд╛рдВ, рд╕рдВрдЦреНрдпрд╛ 24 рдмрджрд▓рдХрд░ 32 рд╣реЛ рдЧрдИ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рдХреЛрдИ рдмрдирд╛рд╡рдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд╣реАрдВ рдереЗ, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рд╣реИред
рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ ChunkVector рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ Y рдФрд░ Z рдЕрдХреНрд╖реЛрдВ рдХреЛ рд╕реНрд╡реИрдк рдХрд░рддрд╛ рд╣реИ:
private void ChunkVector(float[] vec, int offset) throws IOException { vec[offset + 0] = ReadFloat(); vec[offset + 2] = ReadFloat(); vec[offset + 1] = ReadFloat(); }
рдЦреИрд░, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреБрдЫ рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рд░рдВрдЧ рдпрд╛ рдкреНрд░рддрд┐рд╢рдд, рдЙрдирдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреНрд░рд┐рдХреЛрдгреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЛ рдЪреЗрд╣рд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдЕрдиреБрд▓рдВрдмреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ), рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдорд╛рдирджрдВрдб рдЪреЗрд╣рд░реЛрдВ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЪреЗрд╣рд░реЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддреАрди рдХреЛрдиреЗ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж (рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдВрдд рдореЗрдВ, рд╕рднреА рддреНрд░рд┐рдХреЛрдгреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж) рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВред рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛, рдереЛрдбрд╝рд╛ рдЧрдгрд┐рдд - рдФрд░ рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЪреЗрд╣рд░реЛрдВ рдХреА рд╕реВрдЪреА рдХреА рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЪрдВрдХ рдХреЗ рдмрд╛рдж, рдРрд╕реЗ рдЪреЗрд╣рд░реЗ рдмрдиреЗ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рди рдкрд░ рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рд▓рдЧрд╛рдИ рдЧрдИ рд╣реИред рдЙрдирдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╕рдордп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:
mAmbient[0] = 0.587f; mAmbient[1] = 0.587f; mAmbient[2] = 0.587f; mAmbient[3] = 1.0f; mDiffuse[0] = 0.587f; mDiffuse[1] = 0.587f; mDiffuse[2] = 0.587f; mDiffuse[3] = 1.0f; mSpecular[0] = 0.896f; mSpecular[1] = 0.896f; mSpecular[2] = 0.896f; mSpecular[3] = 1.0f; ... int mats = obj.faceMats.size(); for (j = 0; j < mats; j++) { FaceMat mat = obj.faceMats.get(j); if (mat.material != null) { if (mat.material.ambient != null && scene.ambient != null) { for (k = 0; k < 3; k++) mAmbient[k] = mat.material.ambient[k] * scene.ambient[k]; GLES20.glUniform4fv(muAmbient, 1, mAmbient, 0); } else GLES20.glUniform4f(muAmbient, 0, 0, 0, 1); if (mat.material.diffuse != null) GLES20.glUniform4fv(muDiffuse, 1, mat.material.diffuse, 0); else GLES20.glUniform4fv(muDiffuse, 1, mDiffuse, 0); if (mat.material.specular != null) GLES20.glUniform4fv(muSpecular, 1, mat.material.specular, 0); else GLES20.glUniform4fv(muSpecular, 1, mSpecular, 0); GLES20.glUniform1f(muShininess, mat.material.shininess); } else { GLES20.glUniform4f(muAmbient, 0, 0, 0, 1); GLES20.glUniform4fv(muDiffuse, 1, mDiffuse, 0); GLES20.glUniform4fv(muSpecular, 1, mSpecular, 0); GLES20.glUniform1f(muShininess, 0); } GLES20.glDrawElements(GLES20.GL_TRIANGLES, mat.indexBuffer.length, GLES20.GL_UNSIGNED_SHORT, mat.bufOffset * 2); }
рджреЗрдЦрд╛ред
рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд
рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА рдФрд░ рджрд┐рд╢рд╛рддреНрдордХ рд╣реИрдВред рджрд┐рд╢рд╛рддреНрдордХ рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдлрд┐рд░ рд╕реЗ, рдЬрдм рддрдХ рд╣рдо рдмрд╛рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдРрд╕реА рдЫрд╛рдпрд╛ рдХреЛ рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ), рдореИрдВ рдЪрдХрд╛рдЪреМрдВрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣реВрдВрдЧрд╛ред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП shader рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:
private final String vertexShaderCode = "precision mediump float;\n" + "uniform mat4 uMVPMatrix;\n" + "uniform mat4 uMVMatrix;\n" + "uniform mat3 uNMatrix;\n" + "uniform vec4 uAmbient;\n" + "uniform vec4 uDiffuse;\n" + "uniform vec4 uSpecular;\n" + "uniform float uShininess;\n" + ... "vec4 light_point_view_local(vec3 epos, vec3 normal, int idx) {\n" + " vec3 vert2light = uLight[idx].position - epos;\n" + " vec3 ldir = normalize(vert2light);\n" + " vec3 vdir = vec3(0.0, 0.0, 1.0);\n" + " vec3 halfv = normalize(ldir + vdir);\n" + " float NdotL = dot(normal, ldir);\n" + " float NdotH = dot(normal, halfv);\n" + " vec4 outCol = vec4(0.0, 0.0, 0.0, 1.0);\n" + " if (NdotL > 0.0) {\n" + " outCol = uLight[idx].color * uDiffuse * NdotL;\n" + " if (NdotH > 0.0 && uShininess > 0) {\n" + " outCol += uSpecular * pow(NdotH, uShininess);\n" + " }\n" + " }\n" + " return outCol;\n" + "}\n";
рджрд░рдЕрд╕рд▓, рдПрдирдбреАрдУрдЯреАрдПрдЪ рдХреА рдЧрдгрдирд╛ рдФрд░ рдЖрд╡реЗрджрди рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣рд╛рдБ uShininess рдФрд░ Material3D рдореЗрдВ shininess рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЖрдпрд╛рдо рд╣реИрдВ, рдореИрдВрдиреЗ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдЯреАрдХ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ (рдлрд┐рд░ рд╕реЗ, рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ)ред
рдПрдиреАрдореЗрд╢рди
.3ds рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдмрд╕реЗ рдХрдард┐рди рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╖рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдирд┐рдореЗрдЯреЗрдб рдкрдЯрд░рд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛, рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рд╡рд╕реНрддреБрдПрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдХреНрд▓реЛрди рд╣реИрдВ, рддреЛ рдФрд░ рднреА рдЕрдзрд┐рдХ рддрд╛рдХрд┐ рд╡реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рди рд╣реЛрдВред
.3ds рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдПрдХ рд╢реНрд░реЗрдгреАрдмрджреНрдз рдкреЗрдбрд╝ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ "рдкреВрд░реНрд╡рдЬ" рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ "рд╡рдВрд╢рдЬ" рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреЗрдбрд╝ рдХреЗ рдХреЛрдиреЗ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдХреЗ рдХреНрд░рдо рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЖрд╡реЗрджрди рдХреЛ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЙрддреНрд╕реБрдХ рд╣реИ рдХрд┐ 3 рдбреА рдореЙрдбрд▓ рдХреА .3ds рдлрд╝рд╛рдЗрд▓ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдФрд░ рдХреИрдорд░реЗ рд╕рдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдЬреЛ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЛ рдЙрд╕реА рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдм рддрдХ рд╣рдо рдХреЗрд╡рд▓ 3 рдбреА-рдореЙрдбрд▓ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ - рдЙрди рдореЗрдВ рдЖрдВрджреЛрд▓рди, рдШреБрдорд╛рд╡ рдФрд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рдЯреНрд░реИрдХред
рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ:
- рд╡рд╕реНрддреБ рдХрд╛ рдирд╛рдо;
- рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕реНрд╡рдпрдВ рдФрд░ рдЙрд╕рдХреЗ рдкреВрд░реНрд╡рдЬ;
- рдзреБрд░реА рдмрд┐рдВрджреБ (рдзреБрд░реА, рдЙрд╕ рд╡рд╕реНрддреБ рдХрд╛ рд╕рд╢рд░реНрдд рдХреЗрдВрджреНрд░ рдЬрд┐рд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреБрдорд╛рд╡ рдмрдирд╛ рд╣реЛрддрд╛ рд╣реИ);
- рд╢рд┐рдлреНрдЯ, рд░реЛрдЯреЗрд╢рди, рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рдкреНрд░рдореБрдЦ рдлрд╝реНрд░реЗрдореЛрдВ рдХреА рд╕реВрдЪреА, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреИрдорд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ (рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреИрд╕реЗ рдХреИрдорд░реЗ рдЦреБрдж)ред
рдбрд╛рдЙрдирд▓реЛрдбрд┐рдВрдЧ рдЯреНрд░реИрдХ рдЙрдмрд╛рдК рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:
- рдкреВрд░реНрд╡рдЬ рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ (рдЖрдЧрдордирд╛рддреНрдордХ рдкрд░рд┐рдХрд▓реНрдкрдирд╛);
- рдмрджрд▓рд╛рд╡;
- рдореЛрдбрд╝ рдХреА рдЧрдард░реА;
- рд╕реНрдХреЗрд▓рд┐рдВрдЧ;
- рд╡рд╕реНрддреБ рдХреЗрдВрджреНрд░;
- рд╕реНрдерд╛рдиреАрдп рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА (3D рдореЙрдбрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рджреЗрдЦреЗрдВ)ред
рдпрд╣ рдПрдХ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдпрд╣ рд╕рдм рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдФрд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИ: рд░реИрдЦрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдмрд╕ рджреЛ рдлрд╝реНрд░реЗрдореЛрдВ рдХреЗ рдмреАрдЪ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдорд╛рди рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рднреА рдХреНрд░рдорд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП! рдФрд░ рдореБрдЦреНрдп рдлрд╝реНрд░реЗрдореЛрдВ рдХреЗ рдмреАрдЪ, рд╣рдо рдЙрдЪрд┐рдд рдлреНрд░реЗрдо рдХреА рдЙрдкрдпреБрдХреНрдд рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рджреЛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╡рдВрд╢ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди (рдкрд░рд┐рдгрд╛рдо) рдФрд░ рдореЙрдбрд▓ (рджреБрдирд┐рдпрд╛) рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрдиред рдкрд╣рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ - рдЬрдм рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ?
result = parent.result * move * rotate * scale; world = result * Move(-pivot) * trmatrix;
рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдХреЛ рд╢реАрд░реНрд╖ рдкрд░ "рджрд╛рдПрдВ рд╕реЗ рдмрд╛рдПрдВ" рдХреНрд░рдо рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдУрдкрдирдЬреАрдПрд▓ рдореЗрдВ рдкреНрд░рдерд╛рдЧрдд рд╣реИ)ред рдпрд╣рд╛рдВ рдЯреНрд░рдореЗрдЯреНрд░рд┐рдХреНрд╕ 3 рдбреА рдореЙрдбрд▓ рдХреЗ рдЪрдВрдХ рдореЗрдВ рдПрдХ рдХрд╛
рдЙрд▓рдЯрд╛ рд╣реИ ред рдХреБрд▓, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреЗ рд▓рд┐рдП рд░реВрдкрд╛рдВрддрд░рдг рдЧрдгрдирд╛ рдХреЛрдб (рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рд╕рднреА рдлреНрд░реЗрдо рдирдВрдмрд░ 0 рд╕реЗ 1 рддрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрджрд▓ рджрд┐рдП рдЧрдП рдереЗ):
private void lerp3(float[] out, float[] from, float[] to, float t) { for (int i = 0; i < 3; i++) out[i] = from[i] + (to[i] - from[i]) * t; } private AnimKey findVec(AnimKey[] keys, float time) { AnimKey key = keys[keys.length - 1];
рдпрд╣ рд╕рдм рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░рд┐рд╖реНрдХреГрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкреВрд░реНрдг рд╕рдЯреАрдХрддрд╛ рдФрд░ рд╡реИрд╕реЗ рднреА рд╢реБрджреНрдзрддрд╛ рд╕реЗ рдбрд░ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рд╕рдм рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИред рдФрд░ рдпрд╣ рд╕реНрдкреНрд▓рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╣реИ!
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХрд╛ рдореЙрдбрд▓ рдЪрдХреНрд░ рдЕрдм рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИ:
num = scene.animations.size(); for (i = 0; i < num; i++) { Animation anim = scene.animations.get(i); Object3D obj = anim.object; if (obj == null) continue; Matrix.multiplyMM(mMVMatrix, 0, mVMatrix, 0, anim.world, 0); Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVMatrix, 0);
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣ рд╕рдм, рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬреНрдЮрд╛рди рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдареАрдХ рд╣реИ, рд╕рдмрд╕реЗ рдмреАрдорд╛рд░ рд░реЗрдХ, рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдПрдХ рдмрдирд╛рд╡рдЯ рдбрд╛рдЙрдирд▓реЛрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред
рдареАрдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рджрд╛ рдХрд┐рдП рдЧрдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕реНрд░реЛрдд:
рд╕реАрди 3 рдбреА (рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ) рдФрд░
рд▓реЛрдб 3 рдбреАрдПрд╕ (рд▓реЛрдбрд░)ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлрд╛рдЗрд▓реЗрдВ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб ("/ sdcard /") рдХреА рдЬрдбрд╝ рд╕реЗ рднрд░реА рд╣реБрдИ рд╣реИрдВ, рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЗрд╕реЗ рдХреБрдЫ рдФрд░ рдЙрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдЕрдкрдбреЗрдЯ: рдЪреВрдВрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдкреНрд░рддрд┐рдпрд╛рдВ рдЯреВрдЯреА рд╣реБрдИ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реНрд░реЛрдд рдХреЛ рдЪреМрд░рд╕рд╛рдИ рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬреЛрдбрд╝рд╛ред рдЗрдВрдбреЗрдХреНрд╕ рдмрдлрд╝рд░реНрд╕ 2-рдмрд╛рдЗрдЯ рд░рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдУрд╡рд░рдлреНрд▓реЛ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ!