Delphi’s System.Math.Vectors unit contains the TQuaternion3D class.
There is no information about the class in the Help so I post some code here so I remember how to use the class.
Following are some code snippets showing how to use quaternions to transform the mesh vertices in a model according to a skeletal hierarchy.
The procedures are used to build the models from old classic Tomb Raider games and export them to a 3D modelling program.
In Tomb Raider the animation data is stored as an (x,y,z) offset for the root bone and YXZ Euler angles for the rotations of all the bones.
In Tomb Raider a right handed coordinate system is used but the –Y axis is up so usually a further transformation is needed to get the models the right way up in other programs.
Here I do a 180 degree rotation about the X axis.
It is important to do this transformation last since then you don’t have to worry about adjusting the angles or offsets.
The code snippets also use System.Generics.Collections TStack and TList.
I also include a small example for the System.Math.Vectors TMatrix3D class which similarly has no Help topic.
Thursday, 3 May 2018
Tuesday, 20 March 2018
Tomb Raider 3 source code notes
The source code for TR2/TR3 was briefly leaked online in March 2018 (see info).
This post will document my studies of the code.
This post will document my studies of the code.
Wednesday, 13 September 2017
3DS max 2016 Metasequoia (.MQO) Importer
Since the website with the Metasequoia importers/exporters for modern versions of 3DS max has disappeared I tried my hand at compiling sio29’s 3DS max 9 code for 3DS max 2016.
Thursday, 22 June 2017
Writing GIMP Python plug-ins
Notes about writing Python plug-ins for the GNU Image Manipulation Program (GIMP).
The documentation for GIMP Python aka PyGIMP aka Python-fu is woeful.
The official docs are here, [link].
Some web pages for beginners to start with:
The documentation for GIMP Python aka PyGIMP aka Python-fu is woeful.
The official docs are here, [link].
Some web pages for beginners to start with:
- http://zwell.net/content/pygimp.html
- http://www.neuraldump.com/2017/01/program-python-plug-ins-for-gimp-hello-gimp-world/
- https://web.archive.org/web/20150808044417/http://www.exp-media.com:80/content/extending-gimp-python-python-fu-plugins-part-1
- http://tinker.kotaweaver.com/blog/?p=81
- http://muras.eu/2012/05/06/Basic-python-script-for-Gimp/
- https://patdavid.net/2014/02/getting-around-in-gimp-plug-ins-and.html
- http://gimpbook.com/scripting/ (view the slides)
- http://gimpbook.com/scripting/notes.html
- https://www.ibm.com/developerworks/library/os-autogimp/
- http://wiki.elvanor.net/index.php/GIMP_Scripting
- https://gimplearn.net/viewtopic.php/How-to-write-Plug-in-for-GIMP-in-Python?p=10844#p10844
Sunday, 18 June 2017
Github Desktop Program Tutorial
Github Desktop is a GUI program for git version control that is distributed by Github.com.
The video below explains how to use it the best in my opinion.
https://www.youtube.com/watch?v=_qXXAWsxldg
Markdown cheatsheet for writing readme.md is here. [link]
The video below explains how to use it the best in my opinion.
https://www.youtube.com/watch?v=_qXXAWsxldg
Markdown cheatsheet for writing readme.md is here. [link]
Friday, 26 May 2017
WIP: TR42PRJ
Version: 0.71
Status: Released
An attempt to replicate aktrekker’s TR2PRJ program for the TRLE community.
I noticed aktrekker’s program gets some of the geometry incorrect, especially some split sectors and some sectors beneath horizontal doors.
Unlike aktrekker’s program I only extract geometry so rooms will have to be manually reconnected, retextured, and triggers, objects and lights added.
aktrekker’s program seems to convert black in the textures to magenta instead of alpha to magenta so I fixed this too.
Source and release at GitHub. [link]
If building from source you need to download the Vampyre Imaging Library. The latest released version does not compile under Delphi XE7 so get the version from Mercurial repository. [link]
Since I don’t know how aktrekker extracted textures and created doors I may in future add ability to import TR2PRJ’s prj file and inject this data into the prj I create.
Usage:
Status: Released
An attempt to replicate aktrekker’s TR2PRJ program for the TRLE community.
I noticed aktrekker’s program gets some of the geometry incorrect, especially some split sectors and some sectors beneath horizontal doors.
Unlike aktrekker’s program I only extract geometry so rooms will have to be manually reconnected, retextured, and triggers, objects and lights added.
aktrekker’s program seems to convert black in the textures to magenta instead of alpha to magenta so I fixed this too.
Source and release at GitHub. [link]
If building from source you need to download the Vampyre Imaging Library. The latest released version does not compile under Delphi XE7 so get the version from Mercurial repository. [link]
Since I don’t know how aktrekker extracted textures and created doors I may in future add ability to import TR2PRJ’s prj file and inject this data into the prj I create.
Usage:
- Open .TR4 file
- Click Save As to save .prj and .tga file
Monday, 1 May 2017
Delphi TOpenDialog option ofExtensionDifferent
ofExtensionDifferent doesn’t appear to be set in Windows 8.1.
The following example from [link] fails.
procedure TForm1.Button1Click(Sender: TObject); var Done: Boolean; filenamestring : String; begin OpenPictureDialog1.DefaultExt := GraphicExtension(TIcon); filenamestring := GraphicFileMask(TIcon); OpenPictureDialog1.FileName := filenamestring; OpenPictureDialog1.Filter := GraphicFilter(TIcon); OpenPictureDialog1.Options := [ ofFileMustExist, ofHideReadOnly, ofNoChangeDir ]; Done := False; while not Done do begin if OpenPictureDialog1.Execute then begin if not (ofExtensionDifferent in OpenPictureDialog1.Options) then begin Application.Icon.LoadFromFile(OpenPictureDialog1.FileName); Done := True; end else // OpenPictureDialog1.Options := OpenPictureDialog1.Options - ofExtensionDifferent; end else { User cancelled } Done := True; end; end;
CodeTyphon (Lazarus fork) doesn't have this problem.
Subscribe to:
Posts (Atom)