The Forum is up for sale: XeNTaX Forum looking for new owner

Ripping models and vectors from the My Little Pony Gameloft game.

Post questions about game models here, or help out others!
Post Reply
Nelsonarchie
ultra-n00b
Posts: 9
Joined: Tue Aug 09, 2022 12:47 am
Been thanked: 1 time

Ripping models and vectors from the My Little Pony Gameloft game.

Post by Nelsonarchie »

There's this user on Deviantart who managed to both extract and convert the character models from the game into the obj format for blender

https://www.deviantart.com/papercraftking/gallery/all

I want to take a crack at extracting the character models and converting them into Obj Myself. Thing is, i don't know the process of doing this as well as what software is needed to carry out this undertaking. I don't know how he managed to pull it off.

would someone be of assistance in figuring out how the process that DA user used tin extracting and converting those models?
User avatar
Bigchillghost
double-veteran
double-veteran
Posts: 1002
Joined: Tue Jul 05, 2016 9:37 am
Has thanked: 31 times
Been thanked: 1171 times

Re: Ripping models and vectors from the My Little Pony Gameloft game.

Post by Bigchillghost »

Not sure about what kind of response you're expecting here but FYI, one usually needs to upload a couple of sample files as a start.
May you find peace in this puzzle-solving game. Say it with action: click the Image when you get helped.:)
User avatar
Durik256
ultra-veteran
ultra-veteran
Posts: 425
Joined: Wed Nov 21, 2018 7:26 pm
Has thanked: 45 times
Been thanked: 411 times

Re: Ripping models and vectors from the My Little Pony Gameloft game.

Post by Durik256 »

Nelsonarchie wrote: Tue Aug 09, 2022 9:59 am extracting and converting those models?
I remember making a plugin for Ice Age Gameloft. It seems to be the same format. Ice Age Adventures (.rk/.anim) Android.
ok i downloaded the game, plugin from ice age not working.
I find it easier to write a new plugin than fix my old one. (only mesh without bones)

archives [*.ark] from "..\Android\data\com.gameloft.android.ANMP.GloftPOHM"
drop on ARKdumper.exe for unpacking.
[*.rk] 3d model. open with my using plugin for Noesis.
(drop "fmt_rk.py" in "..\noesis\plugins\python")
Image
You do not have the required permissions to view the files attached to this post.
Nelsonarchie
ultra-n00b
Posts: 9
Joined: Tue Aug 09, 2022 12:47 am
Been thanked: 1 time

Re: Ripping models and vectors from the My Little Pony Gameloft game.

Post by Nelsonarchie »

Durik256 wrote: Tue Aug 09, 2022 12:42 pm
Nelsonarchie wrote: Tue Aug 09, 2022 9:59 am extracting and converting those models?
I remember making a plugin for Ice Age Gameloft. It seems to be the same format. Ice Age Adventures (.rk/.anim) Android.
ok i downloaded the game, plugin from ice age not working.
I find it easier to write a new plugin than fix my old one. (only mesh without bones)

archives [*.ark] from "..\Android\data\com.gameloft.android.ANMP.GloftPOHM"
drop on ARKdumper.exe for unpacking.
[*.rk] 3d model. open with my using plugin for Noesis.
(drop "fmt_rk.py" in "..\noesis\plugins\python")
Image
are textures included?
Nelsonarchie
ultra-n00b
Posts: 9
Joined: Tue Aug 09, 2022 12:47 am
Been thanked: 1 time

Re: Ripping models and vectors from the My Little Pony Gameloft game.

Post by Nelsonarchie »

Bigchillghost wrote: Tue Aug 09, 2022 10:19 am Not sure about what kind of response you're expecting here but FYI, one usually needs to upload a couple of sample files as a start.
The files are all there to download on the DA page.
Nelsonarchie
ultra-n00b
Posts: 9
Joined: Tue Aug 09, 2022 12:47 am
Been thanked: 1 time

Re: Ripping models and vectors from the My Little Pony Gameloft game.

Post by Nelsonarchie »

Durik256 wrote: Tue Aug 09, 2022 12:42 pm
Nelsonarchie wrote: Tue Aug 09, 2022 9:59 am extracting and converting those models?
I remember making a plugin for Ice Age Gameloft. It seems to be the same format. Ice Age Adventures (.rk/.anim) Android.
ok i downloaded the game, plugin from ice age not working.
I find it easier to write a new plugin than fix my old one. (only mesh without bones)

archives [*.ark] from "..\Android\data\com.gameloft.android.ANMP.GloftPOHM"
drop on ARKdumper.exe for unpacking.
[*.rk] 3d model. open with my using plugin for Noesis.
(drop "fmt_rk.py" in "..\noesis\plugins\python")
Image
OK, so I don't know if it's just me but the ARK dumper didn't unpack the files properly. The folders are unpacke but nothing is in them
User avatar
05SpeedMaster
veteran
Posts: 121
Joined: Mon Feb 10, 2020 9:24 pm
Has thanked: 18 times
Been thanked: 41 times

Re: Ripping models and vectors from the My Little Pony Gameloft game.

Post by 05SpeedMaster »

Nelsonarchie wrote: Sun Aug 14, 2022 5:01 am
Bigchillghost wrote: Tue Aug 09, 2022 10:19 am Not sure about what kind of response you're expecting here but FYI, one usually needs to upload a couple of sample files as a start.
The files are all there to download on the DA page.
So, You expect people to wade through a link you post to help you?
:roll:
Nelsonarchie
ultra-n00b
Posts: 9
Joined: Tue Aug 09, 2022 12:47 am
Been thanked: 1 time

Re: Ripping models and vectors from the My Little Pony Gameloft game.

Post by Nelsonarchie »

I'm not after a specific model. just the process of how these models were extracted and converted into obj.

Also, I'm getting a failed to load script error on ARKdumper. I'm not sure if it's an issue with the files or the software.
User avatar
Durik256
ultra-veteran
ultra-veteran
Posts: 425
Joined: Wed Nov 21, 2018 7:26 pm
Has thanked: 45 times
Been thanked: 411 times

Re: Ripping models and vectors from the My Little Pony Gameloft game.

Post by Durik256 »

use qbms script
Pandela
ultra-n00b
Posts: 3
Joined: Fri Jan 20, 2023 4:50 am
Has thanked: 2 times

Re: Ripping models and vectors from the My Little Pony Gameloft game.

Post by Pandela »

Durik256 wrote: Tue Aug 09, 2022 12:42 pm
Nelsonarchie wrote: Tue Aug 09, 2022 9:59 am extracting and converting those models?
archives [*.ark] from "..\Android\data\com.gameloft.android.ANMP.GloftPOHM"
drop on ARKdumper.exe for unpacking.
[*.rk] 3d model. open with my using plugin for Noesis.
(drop "fmt_rk.py" in "..\noesis\plugins\python")
Great script many thanks for this! Is there a chance you could update it to support animations and textures too?
I ask because you have a fmt_rk.py on your github too that seems to support all those, but its formatted for Ice Age

Here's some sample files attached too, figure that might help :D
You do not have the required permissions to view the files attached to this post.
Last edited by Pandela on Fri Jan 20, 2023 8:17 am, edited 1 time in total.
Pandela
ultra-n00b
Posts: 3
Joined: Fri Jan 20, 2023 4:50 am
Has thanked: 2 times

Re: Ripping models and vectors from the My Little Pony Gameloft game.

Post by Pandela »

These files partially work, the skeleton loads at least o:
**Edit: Upon further inspection, I'm seeing that a lot of the models have their textures in a separate folder in the pvr format,
I've updated my attachment with a single model and its associated .prv texture.
It appears most if not all the .rk models reference the pvr materials at some point

This is the code I've rather haphazardly modified as I'm just learning all of this, it can load the bones and partially the animations
but the animations are broken in this version it seems :p (the bones move the wrong direction and the model itself stays in place)
This version also doesn't like to load a lot of models besides the bigger ones I think, I know its wrong but I guess its a start

Code: Select all

#by Durik256
from inc_noesis import *

def registerNoesisTypes():
    handle = noesis.register("My Little Pony Gameloft", ".rk")
    noesis.setHandlerTypeCheck(handle, noepyCheckType)
    noesis.setHandlerLoadModel(handle, noepyLoadModel)
    noesis.logPopup()
    return 1
    
def noepyCheckType(data):
    if data[:8] != b'RKFORMAT':
        return 0
    return 1
    
def noepyLoadModel(data, mdlList):
    bs = NoeBitStream(data)
    header = bs.readInt64()
    ver = bs.readInt64()
    master = noeAsciiFromBytes(bs.readBytes(64))
    print('master title: '+str(master))
    
    #vertex info
    v_unk = bs.readInt()
    v_offset = bs.readInt()
    v_count = bs.readInt()
    v_size = bs.readInt()
    #face info
    f_unk = bs.readInt()
    f_offset = bs.readInt()
    f_count = bs.readInt()
    f_size = bs.readInt()
    #bone info
    bs.seek(0x50, NOESEEK_REL)
    b_unk = bs.readInt()
    b_offset = bs.readInt()
    b_count = bs.readInt()
    b_size = bs.readInt()
    print('')
    #print('bones: '+str(b_count))
    #print('bone offset: '+str(b_offset))
    #print('bone size: '+str(b_size))
    #weight info
    bs.seek(0x80, NOESEEK_REL)
    w_unk = bs.readInt()
    w_offset = bs.readInt()
    w_count = bs.readInt()
    w_size = bs.readInt()
    

    #bones read
    bones = []
    bs.seek(b_offset, NOESEEK_ABS)
    print('')
    #print('bone names:')
    for x in range(b_count):
        parent = bs.readInt()
        id = bs.readInt()
        child = bs.readInt()
        mat = NoeMat44.fromBytes(bs.readBytes(64)).toMat43()
        name = noeAsciiFromBytes(bs.readBytes(64)).strip()
        bones.append(NoeBone(id,name,mat,None,parent))
        #print(name)

    #weight read
    weight = []
    bs.seek(w_offset, NOESEEK_ABS)
    for x in range(w_count):
        boneID = [bs.readUByte() for b in range(4)]
        boneW = [bs.readUByte()/255 for b in range(4)]
        weight.append(NoeVertWeight(boneID,boneW))
        print('')
        #print('bone id: '+str(boneID))
        #print('bone weight: '+str(boneW))
        
        
    #face read
    face = []
    bs.seek(f_offset, NOESEEK_ABS)
    face += [bs.readShort() for x in range(f_count)]
    
    #vertex/uv read
    vert, uv = [], []
    bs.seek(v_offset, NOESEEK_ABS)
    for x in range(v_count):
        vert.append(NoeVec3.fromBytes(bs.readBytes(12)))
        #print(x,"ver",vert[-1])
        bs.seek(12, NOESEEK_REL)
        uv.append(NoeVec3([bs.readShort()/32768, bs.readShort()/32768]+[0]))
        #name2 = noeAsciiFromBytes(bs.readBytes(0)).strip()
        #print(name2)
    
    """
    #open all anim from dir
    animDir =  rapi.getDirForFilePath(rapi.getInputName())
    animPaths = []
    for root, dirs, files in os.walk(animDir):
        for fileName in files:
            lowerName = fileName.lower()
            if lowerName.endswith(".anim"):
                fullPath = os.path.join(root, fileName)
                animPaths.append(fullPath)
                #print(fullPath)
    """
    #open 1 anim
    animList = []
    animPath =  os.path.join(rapi.getDirForFilePath(rapi.getInputName()),"pony_type01_applejack_set_lod1.anim")
    with open(animPath, "rb") as animStream:
        animList.append(LoadAnim(animStream.read(),bones))
    #end open 1 anim
    
    ctx = rapi.rpgCreateContext()    
    bs.seek(80)

    
    vinf = [bs.readUInt() for x in range(4)]
    iinf = [bs.readUInt() for x in range(4)]
    #print(vinf)
    #print(iinf)
    
    bs.seek(vinf[1])
    VBUF = bs.readBytes(vinf[3])
    stride = vinf[3]//vinf[2]
    rapi.rpgBindPositionBuffer(VBUF, noesis.RPGEODATA_FLOAT, stride)
    rapi.rpgBindUV1BufferOfs(VBUF, noesis.RPGEODATA_SHORT, stride, 12)
    
    bs.seek(iinf[1])
    IBUF = bs.readBytes(iinf[3])
    rapi.rpgCommitTriangles(IBUF, noesis.RPGEODATA_USHORT, iinf[2], noesis.RPGEO_TRIANGLE)
    

    #uv.append(NoeVec3([bs.readShort()/32768, bs.readShort()/32768]+[0]))
  
    mesh = NoeMesh(face, vert , "mesh_0")
    mesh.setUVs(uv)
    mesh.setWeights(weight)
    #mdl = NoeModel([mesh])
    #mdl.setBones(bones)
    #mdl.setAnims(animList)
    #mdl.setModelMaterials(NoeModelMaterials([], [NoeMaterial("default","")]))
    #mdlList.append(mdl)

    mdl = rapi.rpgConstructModel()
    mdl.setAnims(animList) ##comment out to fix bones for now
    mdl.setBones(bones) ##comment out to fix bones for now

    mdl.setModelMaterials(NoeModelMaterials([], [NoeMaterial("default","")]))
    mdlList.append(mdl)
    rapi.setPreviewOption("setAngOfs", "0 -90 -90")
    return 1

    
def LoadAnim(data,bones):    
    bs = NoeBitStream(data)
    
    header = bs.readInt64()
    ver = bs.readInt64()
    name = noeAsciiFromBytes(bs.readBytes(64))
    print('animation name:')
    print(name)
    #anim info
    bone_count = bs.readInt()
    print('bones in animation')
    print(bone_count)
    frame_count = bs.readInt()
    unk = bs.readInt()#alweys 4
    framerate = bs.readInt()#?
    
    frame_matrix = []
    if bone_count > len(bones):
        return NoeAnim(name, bones, 1, [NoeMat43()]*len(bones), 1)
    
    for f in range(frame_count):
        for x in range(bone_count):
            pos = NoeVec3([bs.readShort()/32 for y in range(3)])
            unk = bs.readUByte()#/255#scale???
            mat = NoeQuat([bs.readByte()/127 for y in range(4)])
            mat = mat.toMat43()
            mat[3] = pos
            
            frame_matrix.append(mat)
    
    anim = NoeAnim(name, bones, frame_count, frame_matrix, framerate)
    print(len(frame_matrix))
    return anim
You do not have the required permissions to view the files attached to this post.
Last edited by Pandela on Sat Jan 21, 2023 4:47 pm, edited 1 time in total.
Pandela
ultra-n00b
Posts: 3
Joined: Fri Jan 20, 2023 4:50 am
Has thanked: 2 times

Re: Ripping models and vectors from the My Little Pony Gameloft game.

Post by Pandela »

I found where the textures are located in the header now, haven't figured out how to load them onto the model itself in noesis yet however

Code: Select all

    #texture/material info
    bs.seek(0x90, NOESEEK_ABS)
    t_unk = bs.readInt()
    t_offset = bs.readInt()
    t_count = bs.readInt()
    t_size = bs.readInt()
    t_test1 = bs.readInt()
    t_test2 = bs.readInt()

    bs.seek(t_offset, NOESEEK_ABS)
    textureName = noeAsciiFromBytes(bs.readBytes(24))
    textureName = textureName.split('\x00')[0]
    print("Texture Name: "+textureName)
    
    #probably texture coordinate/mapping info
    bs.seek(0x70, NOESEEK_ABS)
    idk_unk = bs.readInt()
    idk_offset = bs.readInt()
    idk_count = bs.readInt()
    idk_size = bs.readInt()
    idk_test1 = bs.readInt()
    idk_test2 = bs.readInt()
    idk_test3 = bs.readInt()
    idk_test4 = bs.readInt()
    
    bs.seek(idk_offset, NOESEEK_ABS)
    for x in range(idk_count):
        name = noeAsciiFromBytes(bs.readBytes(64))
        name = name.split('\x00')[0]
        print(name)
        
which prints:
Texture Name: pony_ponyville_67
a_mysterymare_lod1_eyes_open
a_mysterymare_lod1_body
a_mysterymare_lod1_eyes_shut
a_mysterymare_lod1_eyes_frown
a_mysterymare_lod1_eyes_happy
User avatar
Durik256
ultra-veteran
ultra-veteran
Posts: 425
Joined: Wed Nov 21, 2018 7:26 pm
Has thanked: 45 times
Been thanked: 411 times

Re: Ripping models and vectors from the My Little Pony Gameloft game.

Post by Durik256 »

Pandela wrote: Fri Jan 20, 2023 5:01 am Great script many thanks for this!
i update plugin. (texture, uvs, bones , weight...)
fmt_rk.py
Image
Pandela wrote: Fri Jan 20, 2023 5:01 am support animations
Durik256 wrote: Wed Jan 19, 2022 9:50 pm (.rk) models.
if you go to the topic that I wrote above, you will see that I did not finish the animation, since I am not interested in models from these games :ninja:
Post Reply