рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ .3DS рдлрд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ

рдпрд╣ рд▓реЗрдЦ рдЧреНрд▓реЛ рдЗрдлрд╝реЗрдХреНрдЯ рдкрд░ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ .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 рдбреА-рдореЙрдбрд▓ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ - рдЙрди рдореЗрдВ рдЖрдВрджреЛрд▓рди, рдШреБрдорд╛рд╡ рдФрд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рдЯреНрд░реИрдХред

рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ:


рдбрд╛рдЙрдирд▓реЛрдбрд┐рдВрдЧ рдЯреНрд░реИрдХ рдЙрдмрд╛рдК рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:

рдпрд╣ рдПрдХ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдпрд╣ рд╕рдм рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдФрд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИ: рд░реИрдЦрд┐рдХ рдкреНрд░рдХреНрд╖реЗрдк рдмрд╕ рджреЛ рдлрд╝реНрд░реЗрдореЛрдВ рдХреЗ рдмреАрдЪ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдорд╛рди рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рднреА рдХреНрд░рдорд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП! рдФрд░ рдореБрдЦреНрдп рдлрд╝реНрд░реЗрдореЛрдВ рдХреЗ рдмреАрдЪ, рд╣рдо рдЙрдЪрд┐рдд рдлреНрд░реЗрдо рдХреА рдЙрдкрдпреБрдХреНрдд рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рджреЛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╡рдВрд╢ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрди (рдкрд░рд┐рдгрд╛рдо) рдФрд░ рдореЙрдбрд▓ (рджреБрдирд┐рдпрд╛) рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрдиред рдкрд╣рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ - рдЬрдм рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдХрд┐рд╕ рдХреНрд░рдо рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ?

 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]; // We'll use either first, or last, or interpolated key for (int j = 0; j < keys.length; j++) { if (keys[j].time >= time) { if (j > 0) { float local = (time - keys[j - 1].time) / (keys[j].time - keys[j - 1].time); key = new AnimKey(); key.time = time; key.data = new float[3]; lerp3(key.data, keys[j - 1].data, keys[j].data, local); } else key = keys[j]; break; } } return key; } private void applyRot(float[] result, float[] data, float t) { if (Math.abs(data[3]) > 1.0e-7 && Math.hypot(Math.hypot(data[0], data[1]), data[2]) > 1.0e-7) Matrix.rotateM(result, 0, (float) (data[3] * t * 180 / Math.PI), data[0], data[1], data[2]); } public void Compute(float time) { int i, n = animations.size(); for (i = 0; i < n; i++) { Animation anim = animations.get(i); Object3D obj = anim.object; float[] result = new float[16]; Matrix.setIdentityM(result, 0); if (anim.position != null && anim.position.length > 0) { AnimKey key = findVec(anim.position, time); float[] pos = key.data; Matrix.translateM(result, 0, pos[0], pos[1], pos[2]); } if (anim.rotation != null && anim.rotation.length > 0) { // All rotations that are prior to the target time should be applied sequentially for (int j = anim.rotation.length - 1; j > 0; j--) { if (time >= anim.rotation[j].time) // rotation in the past, apply as is applyRot(result, anim.rotation[j].data, 1); else if (time > anim.rotation[j - 1].time) { // rotation between key frames, apply part of it float local = (time - anim.rotation[j - 1].time) / (anim.rotation[j].time - anim.rotation[j - 1].time); applyRot(result, anim.rotation[j].data, local); } // otherwise, it's a rotation in the future, skip it } // Always apply the first rotation applyRot(result, anim.rotation[0].data, 1); } if (anim.scaling != null && anim.scaling.length > 0) { AnimKey key = findVec(anim.scaling, time); float[] scale = key.data; Matrix.scaleM(result, 0, scale[0], scale[1], scale[2]); } if (anim.parent != null) Matrix.multiplyMM(anim.result, 0, anim.parent.result, 0, result, 0); else Matrix.translateM(anim.result, 0, result, 0, 0, 0, 0); if (obj != null && obj.trMatrix != null) { float[] pivot = new float[16]; Matrix.setIdentityM(pivot, 0); Matrix.translateM(pivot, 0, -anim.pivot[0], -anim.pivot[1], -anim.pivot[2]); Matrix.multiplyMM(result, 0, pivot, 0, obj.trMatrix, 0); } else { Matrix.setIdentityM(result, 0); Matrix.translateM(result, 0, -anim.pivot[0], -anim.pivot[1], -anim.pivot[2]); } Matrix.multiplyMM(anim.world, 0, anim.result, 0, result, 0); } } 


рдпрд╣ рд╕рдм рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░рд┐рд╖реНрдХреГрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкреВрд░реНрдг рд╕рдЯреАрдХрддрд╛ рдФрд░ рд╡реИрд╕реЗ рднреА рд╢реБрджреНрдзрддрд╛ рд╕реЗ рдбрд░ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рд╕рдм рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИред рдФрд░ рдпрд╣ рд╕реНрдкреНрд▓рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╣реИ!

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХрд╛ рдореЙрдбрд▓ рдЪрдХреНрд░ рдЕрдм рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИ:

  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); // Apply a ModelView Projection transformation GLES20.glUniformMatrix4fv(muMVPMatrix, 1, false, mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muMVMatrix, 1, false, mMVMatrix, 0); for (j = 0; j < 3; j++) for (k = 0; k < 3; k++) mNMatrix[k*3 + j] = mMVMatrix[k*4 + j]; GLES20.glUniformMatrix3fv(muNMatrix, 1, false, mNMatrix, 0); GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, obj.glVertices); GLES20.glVertexAttribPointer(maPosition, 3, GLES20.GL_FLOAT, false, 32, 0); GLES20.glVertexAttribPointer(maNormal, 3, GLES20.GL_FLOAT, false, 32, 12); GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); ... 


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдпрд╣ рд╕рдм, рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬреНрдЮрд╛рди рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдареАрдХ рд╣реИ, рд╕рдмрд╕реЗ рдмреАрдорд╛рд░ рд░реЗрдХ, рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдПрдХ рдмрдирд╛рд╡рдЯ рдбрд╛рдЙрдирд▓реЛрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред

рдареАрдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рджрд╛ рдХрд┐рдП рдЧрдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕реНрд░реЛрдд: рд╕реАрди 3 рдбреА (рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ) рдФрд░ рд▓реЛрдб 3 рдбреАрдПрд╕ (рд▓реЛрдбрд░)ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлрд╛рдЗрд▓реЗрдВ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб ("/ sdcard /") рдХреА рдЬрдбрд╝ рд╕реЗ рднрд░реА рд╣реБрдИ рд╣реИрдВ, рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЗрд╕реЗ рдХреБрдЫ рдФрд░ рдЙрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

рдЕрдкрдбреЗрдЯ: рдЪреВрдВрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдкреНрд░рддрд┐рдпрд╛рдВ рдЯреВрдЯреА рд╣реБрдИ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реНрд░реЛрдд рдХреЛ рдЪреМрд░рд╕рд╛рдИ рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬреЛрдбрд╝рд╛ред рдЗрдВрдбреЗрдХреНрд╕ рдмрдлрд╝рд░реНрд╕ 2-рдмрд╛рдЗрдЯ рд░рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдУрд╡рд░рдлреНрд▓реЛ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ!

Source: https://habr.com/ru/post/In144955/


All Articles