In this tutorial I show you the (for me, yet) best way to convert a track from NFS5 aka Porsche / Porsche Unleashed to a blender-compatible format.
First of all you obviously need a original copy from nfs5 pu for your pc. I will target the PSX version in another tutorial.
Futhermore you need the NFSPU CRP Track Converter (Credits to Denis Auroux, Bonne, Krom, Nikko, The Born, Addict) which you can download right here – and of course blender.
Note: yet I discovered some errors causing to blender force close on some converted lwo blocks, such as the two "waterfall" blocks on the "forest"-track.
First of all you need to locate the desired track for conversion – in my case I chose “Zone Indutrielle”.
The trackdata can be found under \GameData\Track
To keep a better eye on the converted tracks and data I always copy the files to another location where I can better sort and store the track data, but that is totally up to you.
Step 1 – DRP2DRP
Shipped with the NFSPU CRP Track Converter Tool you find the crp2drp.exe in the main directory.
Once started you might want to select “decompress” and then select the corresponding .crp-file of your track.
This will create a new .drp-file within the folder of which you started:
Step 2: DRP2LWO
Once we got the .drp-file of the selected track from the step above we now can convert it to .lwo file format. Again, shipped with the toolset you find the drp2lwo.exe in the main folder.
As easy as it could be you now just have to select the just created .drp-file
And need to wait a bit until it states “complete”
Then you will find a new folder, named after the .drp-file in the root folder where your track files are located. Inside you will find a bunch of .lwo-files:
Step 3: Converting the textures
Before heading into blender – according to the guide shipped with the toolset – we need to convert our textures.
For this we find the tool “FSH2PTX” in the “FSH2TGA” subfolder of the toolset. This needs to be run via CLI/command line.
Also I recommend to copy the track’s .fsh-file (e.g. industrial.fsh) to the same folder of the fsh2ptx.exe
So the prompt would be
fsh2ptx industrial.fsh
After pressing “Enter” the final conversion starts. This might take a while as there will be a bunch of textures converted.
Important: You need the .tga files - for me, for reasons I do not know, the .tga-files have been deleted once the process was done and only the .ptx files where left. So what I did was to wait until the very last image is successfully converted and then simply duplicate the folder
Once completed (and duplicated the folder at a 100% state), you can remove all .ptx-files as they are not needed, and that results in a folder full of .tga-files:
Again, following the guide, now you need to copy the “Unknown.tga” from the root folder of the toolset to the other track’s tga-files.
Step 4: Merging the folders
This step can differ as it depends on your working structure. As I, as stated before, work with separate folders for the converted track .lwo-files and the .tga-files I now need to join them in one single folder. I tend to call those folders TRACKNAME_united_blender for better identification.
Step 5: Installing the Plugin for blender
Now you need to install the “io_scene_lwo” Plugin into blender.
Step 6: Importing the files
After launching blender, at first I recommend to remove the default objects from the scene at first so we have a clean start.
If you have successfully and correctly installed the “io_scene_lwo” plugin you can now find the lwo-import option from the menu under file > import > LightWave Object
Then navigate to the tracks’s folder you just created
I personally recommend to check these settings
Breakdown of settings:
- Use Existing Materials – as in the NFS universe a Block/LWO-File will have multiple textures assigned blender otherwise tends to create materials for each texture for each object imported, leading to easily over 5.000 materials for the scene. I tried cleaning them up, it was a pure mess.
- Import all files in current directory – simply a pure time saver if you want to import the whole track at once. If you just want specific blocks this setting should be off.
Important: within the process I discovered some force closings of blender within the import process - yet I could strip this down to the following .lwo-blocks of tracks - removing (or leaving them out from import) prevented the force close to happen, yet it seems that animated water is tend to cause the problems here:
- forest:
1045_CNK1624R (1 WATERFALLBACK01).lwo,
1046_CNK1624R (1 WATERFALLFRONT01).lwo - industrial:
327_OBJECT01 MID1.lwo,
328_OBJECT02 MID1.lwo,
329_OBJECT03 MID1.lwo,
330_OBJECT04 MID1.lwo,
331_OBJECT05 MID1.lwo,
332_DOCKWATERCLOSE05 MID1.lwo,
333_OBJECT07 MID1.lwo,
1214_CNK0000L (7 LINE01).lwo,
1219_CNK0016L (7 LINE01).lwo,
1224_CNK0032L (7 LINE01).lwo,
1545_CNK1056L (1 CONVEYOR).lwo,
1547_CNK1056L (1 CONVEYOR01).lwo,
1612_CNK1072L (1 CONVEYOR).lwo,
1614_CNK1072L (1 CONVEYOR01).lwo
Then hit “Import LWO” and wait!
If you encounter a force close this will be caused by a single or multiple faulty blocks - I then start to import 100 files at once, save, and keep doing this until I reach the 100-block-set causing a force close and strip it down until I find the block(s) that cause the trouble. Mostly those blocks are only one or two, but finding them is kind of hard. Maybe you can reach out to the reNFS5 Project via Discord:
Once the import has successfully completed you will find the track inside blender – even if you switch to textured view there wont be any textures:
Step 7: Run the texture script
Inside the toolbox you will find a readme containing a script. Don’t bother, here is the script for you:
import bpy
import bpy
for obj in bpy.context.scene.objects:
if obj.type == "MESH":
for mat_slot in obj.material_slots:
mat = mat_slot.material
if mat:
has_unused_texture = False
for node in mat.node_tree.nodes:
if node.type == "TEX_IMAGE" and not node.outputs[0].is_linked:
has_unused_texture = True
for input in mat.node_tree.nodes["Principled BSDF"].inputs:
if input.name == "Base Color":
mat.node_tree.links.new(node.outputs[0], input)
break
break
if not has_unused_texture:
print("Material", mat.name, "has no unused image texture.")
Copy this script and run it in the script window of blender. Please make sure that during the import AND before running the script the corresponding .tga-files have been in the same folder (not any subfolder) of your imported .lwo-files!
Insert the script and click “play” – wait a bit and your viewport will turn back to default shading, if you switch now back to textured view, you will see the track beautifully textured:
Step 8 – optional – cleaning the object mess
As the track is now successfully imported you will find a pretty mess of easily over 1.000 single objects. For my further use that is totally useless, so I tend to sort the objects to
- road
- landscape
- signs and other objects
- foliage
- movables
- blockers
For this I simply create new collections and name them correspondingly
Once all sorting is done I can toggle all specific groups to check all objects are – more or less – properly sorted (I need this for the future rework of the track(s)).
After having them successfully sorted the objects are being united (except the movables). To do so just select all objects and press CTRL+J in object mode in the viewport.
Step 9 – further processing
As the track is now imported and saved you can do whatever your next steps are.
You can download the blender project here
Here you can discover how I continued to import them into the unreal engine 5 for the High Stakes project.