Jump to content


  • Content Count

  • Joined

  • Last visited

  • Days Won


Kryslin last won the day on December 30 2019

Kryslin had the most liked content!

Community Reputation

11 Civilian

About Kryslin

  • Rank

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. I managed to get gasetools built and am currently tearing apart .xnj files as we speak. .xna/.xnm and others soon to follow. From a mathematical standpoint, those included matrices don't look right; The almost look like transposed or inverted matices to begin with. It's often a shortcut by 3d packages to be able to easily convert from local transformation to world transformation, or something like that.
  2. Let's see if I can suggest something useful this time... This assumes you have a stack you can push matrices onto / pop them off of... 1) Push the world matrix onto the stack. (for static display, an identity matrix will do) 1a) First Bone is at (0,0,0) 2) Grab the current bone's translate / rotation / scale values, build a matrix - Scale first, Rotation Second, translate last. 3) Multiply local matrix by matrix on top of stack 4) Apply 3) to current bone point; This gives a world position. the offset is generated by subtracting the parent's world position. -I would use 0,0,0 because the bone represents the center of rotation for it's affected vertices. -For ,nj I used the model center in the chunk I was processing. 5) If the bone has a child: 5a) Push the current matrix onto the stack 5b) Call 2) recursively to process the child bone(s) 5c) Pop the matrix off the stack 6) If the bone has a sibling: 6a) Call 2) recursively to process the sibling bone(s) 7) Get outta here... This is what I used to generate bone information from .nj files.
  3. Was kind of expecting this. Ah well. Anyway, since I have copious amounts of free time, if you need someone to do stupid, repetitive testing of things, I'm game, drop me an e-mail.
  4. *edit 2* Ok... 1) Add 1 to all Bone ID's (and nothing else) 2) Swap the first 2 ID's. 3) Set the last ID to 21. 4) Hierarchy can now be walked recursively. I suspect it's a bit of deliberate obfuscation on Sega's part. What I did to figure this out was start at the bone ID's that don't have children, and walk up the tree in reverse (I wouldn't want to do this on a production ready animation rig with some 200 bones and 4000 controllers, though...), and rebuild the tree from that.
  5. Okay, I went back through my old source code (dear lord, what a mess), and figured out how I determined bone positions: I would walk the hierarchy recursively, then when I hit something with no parent, I would start adding the positions together... Public Function GetBonePosition(ByVal N As Integer) As Types.XYZCoord Dim retv As New Types.XYZCoord If N = -1 Then retv = New Types.XYZCoord(0, 0, 0) Else retv = GetBonePosition(Me.bn(N).Parent) + Me.bn(N).Position End If Return retv.Clone End Function Types.XYZCoord is a basic structure float X float Y float Z It's part of a class definition I used, that also had basic operators defined for working on 3D vectors. It's functionally the same as Vector3D. My suggestion of using the entire transformation matrix was incorrect; you'd only want to do this IF your bones are all <0,0,distance> / Oriented down the Z+ axis). I'd have to dig a little further to figure out how I got the bone positions,
  6. Huh. Yet, Lightwave's rotation order is YXZ. (I know, I have LW 2019.1.4 open right now.) Eh, no biggy.
  7. It looks like someone took apart ExMLDNet for most of it. I can see one error which needs to be rectified; Lightwave's rotation order is YXZ, not ZXY. Some of it even looks like bits of my code, too.
  8. Ironically, the way I generated the bones were to add the position data from each node that had vertices in it, because that's how the .nj for mat stored them. For animation data, there was some math involved getting the bones to point down the <0,0,1> vector. Something I was going to implement in ExMLDNet was the last bone in each chain; there were empty nodes in each chain at the end that did have position data attached to them (ideally, for characters, this was where a weapon model could be 'attached' to the model). I was going to get the last position and add a bone. I'll take a look at what you've posted earlier on the bone data (and my own notes on .nj/.njm), and see if I can't think of something of use. (I've just got Visual Studio reloaded, I'll have to grab my old source code and dig back into it again...)
  9. There is something definitely wrong with the clear boxes of Protectors Zeta, C & B; I've had one completely EMPTY, and the only thing that appears to be dropping are Star Atomizers and De Ragan room decorations. *edit* Make that 2 completely empty. *edit 2* Add A difficulty to that list as well. 1 Star Atomizer, 1 De Ragan. And that was with two players; the other runs have been solo. (Thanks to Manganese Blade for joining me!)
  10. Yeah, I had the same problems with .dae and .x; XML is no fun to work with without an extensive library backing you up. You are correct, GLTF 2.0 appears to be much nicer, and blender imports it nicely. Re: Bones Use the same 4x4 transformation matrix for both the bones and mesh, it makes things easier. Really, all the bone does is define a rotation center and the local z axis for transformation. When computing the actual influence each bone has on the points, multiply the transformation by the bone's weight. So, you take the parent's 4 x 4 matrix, and multiply it by the new transformation matrix, until you run out of things in your hierarchy, Apply each transformation to the vertex list. You can probably come up with more efficient weighs of doing things than making 16 passes through your vertex list. Maybe link vertices to bones? Once all the points are transformed, issue your draw call. Ideally, you should have 1 draw call per material. 1) Get the vertices for the bone 2) Get it's transformation matrix 3) new vertex = (old vertex - center of rotation) * transformation matrix) + center of rotation. 4)When you've processed every bone, draw the thing.
  11. Has any thought every been given to an actual reporting system for bugs found in the server software? I think github has a mechanism for reporting bugs for projects, surely there must be an open source package that could be used? I mean, yes, the forums and discord are nice and immediate, but would having an actual bug tracking system make things easier for the developers, so they're not tracking down duplicate bugs all the time?
  12. Kryslin

    Player Shop Bug

    Go to your PM, choose redecorate (not room decorations), and choose your open shop ticket. Your room should reload at that point, and your store is open! If you want to sell common items, try not to price them higher than what the NPC stores sell them for, though items with higher percentages are worth more.
  13. I know I haven't had any issues with placing decorations - I've managed to find De Ragan decorations in Protectors Zeta - but that is in the Natural Matte layout, and not one of the newer layouts. By Newer, I mean the layouts that expand the room, most of them in AotI; the older room layouts that shipped with PSU initially seem to work.
  14. You can choose whatever model file format you want; you may have to go digging through someone's SDK for the information to write them correctly, though. DAE and FBX both have text formats, and store rigging and animation data. FBX does have the capability to store textures within the file. Lightwave uses a pair of files : LWO and LWS to store models (LWO) and animation/rigging (LWS). Images are stored external to the model. Blender .blend files contain everything, I believe. .obj only stores model information; on the plus side, it's well understood, and in Ascii. Daz3D and Poser store rigging information in a .cr2 file, which contains rigging, morphs, animation data, etc. microsoft .x is well documented and may work well, but I don't know what applications use it. .3ds, .ma, and .mb are all proprietary Autodesk formats. If you want something every 3d app can read, .fbx and .dae are your best bets, along with the LWO2 lightwave object file. (Lightwave used LWO3 now, but can still read LWO1/2 files). As far as alternative compression formats, why not use .zip? There are several 3rd party opensource libraries for such.
  • Create New...