The "What Are You Working On?" Thread

@Mr Whippy I guess ultimately the best way to see if a particular method works is to just test it and find out :p Results speak for themselves etc. etc. lol

I agree.
I suppose I can use the importer/editor as it'll no doubt use the same renderer as the game engine itself. I can at least do visual checks?
So far I've not had much luck getting a car working in AC, just following the tutorial and renaming that open wheeler car name made AC error haha :D




@Stereo, authoring normals is a pita in Max too. That's likely why many in the industry avoid custom normals unless they have big teams who can have nice tools written to manage them easily.
Assuming AC does indeed use them, this is the script I use for Max, found somewhere on polycount wiki/threads.

Given your knowledge with blender and python, perhaps this could be used as inspiration for a blender tool?

Basically it 'smooths' any given selection of faces the usual way, but saves those smoothed normals. An example workflow is posted below.
Original author's code here:
Code:
macroScript GetVertNormalsFromFaces
category:"Normal Tools"
buttonText:"Get Vert Normals from Faces"
tooltip:"Get Vert Normals from Faces"
(

   function getVertNormalsFromFaces =
   (
       if (getCommandPanelTaskMode() != #modify) do
           setCommandPanelTaskMode #modify

       if (Filters.Is_EditPoly()) do
       (
           local theNode = selection[1]
           local theEditObj = modPanel.getCurrentObject()
           local theEditNorm = undefined

           local iModIndex = theNode.modifiers.count

           if ((classOf theEditObj) == Editable_Poly) then
           (
               theEditNorm = theNode.modifiers[theNode.modifiers.count]

               local baFaceSelection = polyOp.getFaceSelection theEditObj
           )

           if (not baFaceSelection.isEmpty) do
           (
               if ((classOf theEditNorm) == UndefinedClass) then
               (
                   theEditNorm = Edit_Normals()
                   addModifier theNode theEditNorm
               )
               else if ((classOf theEditNorm) != Edit_Normals) then
               (
                   theEditNorm = Edit_Normals()
                   addModifier theNode theEditNorm before:iModIndex
               )

               if (theEditNorm != undefined) do
               (
                   local baVertsFromFaceSelection = polyOp.getVertsUsingFace theEditObj baFaceSelection

                   local ap3FaceNormals = for iFace = 1 to (polyOp.getNumFaces theEditObj) collect
                       ( if (baFaceSelection[iFace]) then ( polyOp.getFaceNormal theEditObj iFace ) else ( 0.0 ) )

                   modPanel.setCurrentObject theEditNorm

                   local abaFaceVertNormals = #()

                   for iFace = 1 to (polyOp.getNumFaces theEditObj) do
                   (
                       local baFaceVertNormals = #{}

                       if (baFaceSelection[iFace]) do
                           theEditNorm.convertFaceSelection #{iFace} baFaceVertNormals node:theNode

                       append abaFaceVertNormals baFaceVertNormals
                   )

                   local baAllVertNormals = #{}
                   theEditNorm.convertFaceSelection baFaceSelection baAllVertNormals node:theNode

                   for iVert in baVertsFromFaceSelection do
                   (
                       local baVertNormals = #{}
                       theEditNorm.convertVertexSelection #{iVert} baVertNormals node:theNode

                       baVertNormals *= baAllVertNormals

                       local baProxiFaces = (polyOp.getFacesUsingVert theEditObj iVert) * baFaceSelection

                       if (baVertNormals.numberSet == 1) then
                       (
                           local p3AvgFaceNormal = Point3 0.0 0.0 0.0

                           for iFace in baProxiFaces do
                               p3AvgFaceNormal += ap3FaceNormals[iFace]

                           p3AvgFaceNormal /= baProxiFaces.numberSet

                           local iNormal = (baVertNormals as Array)[1]
                           theEditNorm.setNormal iNormal p3AvgFaceNormal node:theNode
                       )
                       else
                       (
                           for iNormal in baVertNormals do
                           (
                               local p3AvgFaceNormal = Point3 0.0 0.0 0.0

                               for iFace in baProxiFaces do
                                   if (abaFaceVertNormals[iFace][iNormal]) do
                                       p3AvgFaceNormal += ap3FaceNormals[iFace]

                               p3AvgFaceNormal = normalize p3AvgFaceNormal

                               theEditNorm.setNormal iNormal p3AvgFaceNormal node:theNode
                           )
                       )
                   )

                   theEditNorm.makeExplicit selection:baAllVertNormals node:theNode

                   maxOps.collapseNodeTo theNode theNode.modifiers.count true
                   modPanel.setCurrentObject theNode.baseObject

                   subObjectLevel = 4
               )
           )
       )
   )

   on execute do
   (
       undo "Get Vert Normals From Faces" on
       (
           getVertNormalsFromFaces()
       )
   )

)

Starting:
before.JPG

Selected top faces:
selected.JPG

Smoothed top faces normals:
smoothed.JPG
Selected perpendicular faces:
selected2.JPG

Smoothed perpendicular faces:
smoothed2.JPG

Deleted perpendicular faces:
end.JPG


So basically you do a chamfer for a 45deg edge. Select the main panel faces, process them, select the perp faces, process them... this leaves the 45deg faces with normals that wrap from front main panel facing to perp facing at the back.
Then you trim those back faces.

Now if AC doesn't support this then fine.

But if it does then this is a really nice way to reduce polys, increase ease of tweaking (keeping those support loops normals smooth is near impossible by hand!), easier UV mapping and probably better looking AO into panel gaps, and once you understand the workflow it's imo easier to work with and use vs support loop methodology!


I've been using this approach in Racer and it looks nice.
 
One difference to Blender iirc is that Max is built to use smoothing groups of faces, whereas Blender does smoothing with sharp edges. Probably if I was going to do something like that, I'd select the faces that should be ignored, and have the script delete them, recalculate normals for any vertices, save the normals, and then recreate the faces.

Recently I've been skipping updates to blender cause the fbx exporter is less compatible with AC's editor. I forget exactly what wasn't working but it was something with animations or object origins or something. So I'm not using a version of Blender that can edit normals.
 
One difference to Blender iirc is that Max is built to use smoothing groups of faces, whereas Blender does smoothing with sharp edges. Probably if I was going to do something like that, I'd select the faces that should be ignored, and have the script delete them, recalculate normals for any vertices, save the normals, and then recreate the faces.

Recently I've been skipping updates to blender cause the fbx exporter is less compatible with AC's editor. I forget exactly what wasn't working but it was something with animations or object origins or something. So I'm not using a version of Blender that can edit normals.
I just upgraded to the latest and haven't seen any issues using 7.4 or 6.1 fbx export with tracks so far. Obviously we sadly don't do any animations with tracks though. Also as far as I know there is no issue in having more than one blender version installed.
 
Finally got the bloody wing mirrors done, no idea why but they've been annoying me all week, struggling to find proper reference. Anyway, onto some more fun stuff, like front bumper details. Plus a nice bonus for doing so many cars of the same brand, I could just copy/paste the Ford badge, textures and all :D

MfyonPth.jpg

N1rsaS5h.jpg

xsUvMNZh.jpg

RsWZfGyh.jpg


Hopefully get the rear bumper bits done tomorrow, and maybe exhaust too.
 
Last edited:
Also as far as I know there is no issue in having more than one blender version installed.
Yeah, but if I use a feature from the new one and export from the old, the new normals modifier won't show up anyway.

I think it was just something that would have been annoying to change partway through a project (maybe existing ksanim stopped being right), maybe next time I start one I'll try to use a new version the whole way.
 
I have finished the first guidemesh for my Fierce Volvo.

000439.jpg


000442.jpg


subsurface.jpg

It is for the rims. In Denmark they are known as Brazil rims, but it is Mangels 8 spoke steel rims.

s-l1600 (42).jpg


ESM08X15-2.jpg


I am following CGMasters ”Complete Vehicle Production in Blender” and adapt it as I go along.
I decided to get this, after having watched the free “Modeling Car Rims in Blender” chapter.

You can see the chapter here:

Earlier post about the car.
http://www.racedepartment.com/posts/2395064/

Nisseringen is not abondonned, it is just on hold, while I do some Pointcloud research.

Happy modding
 
what a complex talk that goes over here ! its mad science

about myself ALMOST had a go to restart the m3 as i notice the side panel overhall geometry was "way" off but i didnt had to restart the car at all :D (that would be dumb) with a bit of patience you go there...So it has a nice round shape from side

Also now the car has also a back window so you can protect yourself inside the cockpit a bit more:thumbsup:

eGHMMb4.png

Geometry fix - GIF
v6eCpDW.gif

Geometry fix - Light
4T5XhSK.png
 
Last edited:
Yep that's weighted normals...

I think that script is for face weighted normals, so it's giving the larger faces normal dominance over the smaller faces/triangles.

Notice how the script doesn't need to know which faces should be flat, and which are assumed to be chamfers, to get the 'correct' look.

I'm sure the script I posted is for classic normal weighting using the average of the face normals irrespective of the face size, and as Stereo rightly pointed out, what you're essentially doing is saying which faces should be ignored for the normal calculation (the ones you don't set explicitly, the chamfers which you could 'fill in' later), and so they just get the normals of the neighbouring explicitly set faces.

It may look like a trivial difference, but if you bake normals the subtle remaining curvature on a flat surface from the very light influence of the chamfer edges, means normal maps have gradients across the supposedly flat areas.



For cars work, trying to reduce the support loops geometry and editing difficulty, I'm not sure what the impact might be of using FWN vs explicitly set normals... hmmmm.

Once I get Steam and AC installed on my laptop I'll have a play around :)
 
what a complex talk that goes over here ! its mad science

about myself ALMOST had a go to restart the m3 as i notice the side panel overhall geometry was "way" off but i didnt had to restart the car at all :D (that would be dumb) with a bit of patience you go there...So it has a nice round shape from side

Also now the car has also a back window so you can protect yourself inside the cockpit a bit more:thumbsup:

eGHMMb4.png

Geometry fix - GIF
v6eCpDW.gif

Geometry fix - Light
4T5XhSK.png

Wow nice work.

When I made an E46 M3 the sides were the hardest bit to get right.

Just like the E36, in blueprints the sides don't really show up well at all, but the subtle difference to the geometry can make a huge difference to the actual finished appearance due to the reflections!

Your before 'looks' right, but the 'after' looks right when seeing the straight reflection... I hate car sides :D
 
This is wrong, way too much detail.

The idea is to shrinkwrap the true mesh, as I build it on top of the guidemesh. I have the shape and can consentrate on creating a clean mesh. It should give the true mesh a better lightflow. For it to work proberly the guidemesh needs to be very high poly. That is how I understand it.
I like the tecnique as It resonnates with my quirks.

We will see how it goes.
 
@rest: AC is perfectly capable of handling vertex normals for tracks; why wouldn't it for cars?
I have to admit that I understand only like 10% of all the Normal talk here, all I used so far was "Edge Split" and whatever value in it that resulted in the desired smoothness :unsure: ...but aren't Vertex normals just the result of turning on this option?
1.jpg

AC can interpret it perfectly fine on cars
 

Latest News

Do you prefer licensed hardware?

  • Yes for me it is vital

  • Yes, but only if it's a manufacturer I like

  • Yes, but only if the price is right

  • No, a generic wheel is fine

  • No, I would be ok with a replica


Results are only viewable after voting.
Back
Top