Can't comprehend custom skinning values

Hello,

There is a website which uses Three.js to show 3d models but I think it uses custom skinning, to achieve 8 influence per vertex but it makes it hard for me to understand how that works.

Basically in the SkinnedMesh’s geometry there is no skinIndex and skinWeight arrays, instead it has skin0 skin1 skin2 skin3 arrays, which contains arrays of 4 values, [int, float, int, float].

At first i thought that it is index and weight paris, so i got the 8 influences but the weights are between -5 and 5 so it makes no sense to me. Tried to normalize the weights between 0..1 but they dont add up to 1, pls help.

Here is one example of the first array of skin0 skin1 skin2 skin3:
[3, -4.507774353027344, 170, -2.250873565673828]
[191, 0.1589990109205246, 168, -4.049271583557129]
[6, 1.9669184684753418, 0, 0]
[0, 0, 0, 0]

Please help me understand what are these values, without understanding this i cannot export the model in the correct position.
Also saw that if there is unused influences the missing part is filled with zeroes like in the example.
Here is the structure of the SkinnedMesh:

bodyUpper: Object { uuid: “FA1CA210-9E6A-44DE-AF22-331EE64A64DF”, name: “bodyUpper”, type: “SkinnedMesh”, … }
_makeParentScaleUniform: false
_matrix: Object { elements: (16) […] }
_matrixImmutable: Object { elements: (16) […] }
_matrixNeedsUpdate: 0
_matrixWorld: Object { elements: (16) […] }
_matrixWorldImmutable: Object { elements: (16) […] }
_matrixWorldNeedsUpdate: 0
_removeParentScale: false
_snapBones: null
bakeMaterials: Object { physical2: {…}, physical2Decals: {…}, color: {…}, … }
bindMatrix: Object { elements: (16) […] }
bindMatrixInverse: Object { elements: (16) […] }
bindMode: “attached”
castShadow: true
children: Array
customDepthMaterial: Object { uuid: “1DF61ED7-A29F-4E9E-B6C7-D1340AC20894”, name: “Material83”, type: “RawShaderMaterial”, … }
dependents: Array
drawMode: 0
frustumCulled: false
geometry: Object { uuid: “2BB6AC39-DA3E-4BCF-900A-D8EFCF4CD8C6”, name: “bodyUpper”, type: “BufferGeometry”, … }
_listeners: Object { dispose: (1) […] }
_ofc: 12782
_opc: 7021
attributes: Object { position: {…}, normal: {…}, uv: {…}, … }
color: Object { uuid: “DF7A0696-1C8A-49DE-A5CD-00BFE032CD23”, itemSize: 3, count: 7029, … }
instanceIndex: Object { uuid: “70E38246-C1D8-4699-90AE-8D100BEB1292”, itemSize: 1, count: 16, … }
normal: Object { uuid: “D217A3B2-4A53-44FB-A611-43721EBDCCBE”, itemSize: 3, count: 7029, … }
position: Object { uuid: “95A73E39-7359-4F7A-B3A2-36E69BD48EEA”, itemSize: 3, count: 7029, … }
skin0: Object { uuid: “76A5181F-3A77-4A34-9FBF-9FD57377E245”, itemSize: 4, count: 7029, … }
skin1: Object { uuid: “829488D9-F8D5-45B1-916C-DC064B1C2AFC”, itemSize: 4, count: 7029, … }
skin2: Object { uuid: “104D5B60-A17A-4452-ACC1-FA4E1868D3FF”, itemSize: 4, count: 7029, … }
skin3: Object { uuid: “A693D014-0F9E-4395-97A2-9FA785CA6B78”, itemSize: 4, count: 7029, … }
uv: Object { uuid: “FB56E767-3C7C-4E0C-964A-11DFD6880693”, itemSize: 2, count: 7029, … }
: Object { … }
boundingBox: null
boundingSphere: null
ckBoundaries: Array [ {…}, {…} ]
ckBounds: Object { min: {…}, max: {…} }
ckFaceSizes: undefined
ckPosGroup: undefined
ckRivets: Object { backAttach: {…}, piercingBelly: {…} }
ckSeamBoundaries: Uint8Array(2386) [ 0, 2, 0, … ]
ckSeamHalfEdge: Uint32Array(7158) [ 11, 3, 4294967295, … ]
ckSeamOriginalIndices: Uint32Array(2386) [ 9975, 9976, 9972, … ]
ckSeams: Uint32Array(6) [ 4, 76, 226, … ]
ckUIOffset: Object { x: 0, y: 0, z: 0, … }
ckUIRotation: Object { _x: 0, _y: 0, _z: 0, … }
ckbOriginalIndices: undefined
ckbTotalInfluences: 8
ckbVertToPointIndices: undefined
colorSetCount: 1
colorSetNames: Object { id: {…} }
drawRange: Object { start: 0, count: Infinity }
exportTime: 1742504984576
extremeIndices: Uint32Array(6) [ 710, 4232, 3130, … ]
extremePositions: Float32Array(18) [ 0.28940775990486145, 2.370443344116211, -1.273428201675415, … ]
frustumCulled: false
groups: Array
id: 85
index: Object { uuid: “3B73ACB2-2E79-4592-A36A-7E73419DEE2A”, itemSize: 1, count: 38382, … }
isInstancedBufferGeometry: false
isMixerBuffer: true
jointMasks: undefined
locators: Object { }
mainSkeleton: false
maxInstancedCount: 4
mixerBones: Array
mixerBonesByOrigID: Object { }
morphAttributes: Object { position: (10) […], normal: (10) […] }
morphBakeAttributes: undefined
morphSkinFixKey: “fallback”
morphTargetDictionary: Object { hide: 0, bustVertical: 1, forearmL: 2, … }
morphTargetInfluences: Array(10) [ 0, 0, 0, … ]
name: “bodyUpper”
paintMapping: undefined
polygonBlendTargets: undefined
poses: Object { }
skinInfluenceCount: 8
skinNames: Array(4) [ “skin0”, “skin1”, “skin2”, … ]
skinned: 1
type: “BufferGeometry”
uuid: “2BB6AC39-DA3E-4BCF-900A-D8EFCF4CD8C6”

I don’t think weights need to sum to 1.
They can be whatever, and are just accumulated.. and the result divided by the sum. You Can normalize them, but it’s not required.