POST
|
Hi Ledrom Thanks for your reply, and your solution. You are exactly right, a watertight mesh would be useful 😄 Cheers, David
... View more
08-10-2012
02:06 AM
|
0
|
0
|
1070
|
POST
|
Hi Malabamba Google translate isn't perfect, so it is hard to understand exactly what your question means. Also, my knowledge of CGA is far from perfect too. But I'll do my best. Cheers, David (1) Is there a way to make it move, "inseparable" from the adjacent polygons? I don't think CityEngine operates in the same way that 3d modelling packages, by stretching the connected polygons. So I would say 'no'. (2) Is there any way to know the coordinates of the vertices of the polygon? Surprisingly, I don't think you can get the coordinates of the vertices directly. There are a number of functions you can perform: including geometry.Area / geometry.isRectangular / geometry.isPlanar / geometry.isConcave. These return a value, like the area, or test the shape of the geometry. 3) Can somehow get access to a variety of materials id, from imported mesh? I think this is not possible, regrettably
... View more
08-07-2012
01:18 PM
|
0
|
0
|
331
|
POST
|
I'm fairly sure this is impossible, but I have to ask. Is there a solution in CityEngine to avoid coplanar and open edges on models? When I split scopes away, it detaches faces from each other. So when I import the models into 3ds Max, the model looks perfect. However, the some of the polygons are 'floating', i.e. not attached to the polygons nearby. It isn't a bug, I know, it is just the way the CGA rules operate using a shape tree. Sometimes, I can weld 'floating' polygons together if there is a handy vertex nearby, but often there isn't. Is there a solution for these orphan polygons, to avoid coplanar and open edges? Just to emphasize, the models look perfect in 3ds Max and it isn't a bug. Thanks for reading!
... View more
08-05-2012
08:24 AM
|
0
|
6
|
3279
|
POST
|
unsolvable issue Thanks for the insight Matthias, appreciated 😄 It is ok, I found another way to do it that serves the same purpose. Once the core height is exceeded, the recursive sections stop. To get that nice section protruding above the core, which is a characteristic of your futuristic-NYC example, instead I randomly add a building cap (split and textured to match the recursive sections) to the top of the core height.
... View more
08-04-2012
06:11 AM
|
0
|
0
|
515
|
POST
|
Wow, this is really puzzling. I made a new generic 3ds Max cube, converted it to editable polygons, and exported it as an FBX and OBJ. The FBX and OBJ files seem to consistently work differently with the 'touches()' rule. Unfortunately, neither are giving the results I'm hoping for. For the sake of completeness: MAX, ASE and 3DS formats give the same (regrettably, incorrect) results as FBX. Here is a 1-minute video of what I mean: [video=youtube_share;Reo5w2Pqalo]http://youtu.be/Reo5w2Pqalo[/video] As far as I can tell, all the blocks on screen should get recursive sections. But only a (consistent) few seem to get them.
... View more
07-20-2012
11:12 PM
|
0
|
0
|
515
|
POST
|
Hooray, I think I've solved it 😄 It seems the rule file is working fine. The problem seems to occur only with some specific volume shapes that I'm using (OBJ format), that I made made initially in 3ds Max. The volumes giving trouble aren't complex shapes (even a cube!) but they have something that conflicts with the touches() instruction, causing it to be ignored. Interesting, I'll look at the volumes in more detail later today.
... View more
07-19-2012
03:42 PM
|
0
|
0
|
515
|
POST
|
Hi Folks Here is something that has been puzzling me for ages. I've been trying to (roughly) emulate the terrific-looking NYC2259 recursive vertical splits. However, due to my shortfall in skill, I'm using a much simpler approach. It goes like this: The core has a given height, and the sections have a given (potential) height. For this example, the potential section height is twice the height of the core. Using the touches() instruction as a limitation, the randomized recursive vertical split and gaps should keep looping upwards while they touch the core. --If the sections and gaps loop too high ,to where the sections are not touching the core (i.e. be floating in the air and unsupported) so they will stop (give NIL). --If the sections and gaps reach the maximum specified section height, they will also stop. What puzzles me is that seems to work great, but not all the time. I've embedded the script below, and here you can see it on this 2-minute video: http://youtu.be/j8phESvleRM If I split, translate or rescale the core geometry, the core geometry is always generated but, often, the section geometry is not generated at all*. But if I turn off the touches() limitation, both the sections and core are generated of course. Yet, the generated section geometry is visibly touching one or more elements of the core. As I understand it, the touches() should pick up contact with any shape tree. Perhaps there is there something that I am missing? Thanks for your help! David * yes, I'm working with watertight volumes, not polygons #################################################################################################################################### ## VARIABLES #################################################################################################################################### ## Level of Detail attr LOD = 1 ############################ ## Height and floors numberOfFloors = rint((scope.sx * scope.sz)/floorHeight/10 * popDensityFactor ) popDensityFactor = 1 coreHeight = numberOfFloors * floorHeight // actual height of the core sectionHeight = numberOfFloors * floorHeight * 2 // potential maximum height of the recursive sections and building floorHeight = 3 tileWidth = 3 ############################ ## Sections sectionRandomizer = (rint(randomSectionDistribution * sectionHeight *.75/floorHeight)) * floorHeight randomSectionDistribution = 15%:.4 20%:.2 20%:.1 20%:.5 else: .3 gapRandomizer = (rint(randomGapDistribution * sectionHeight *.75/floorHeight)) * floorHeight randomGapDistribution = 50%:.05 20%:.1 20%:.2 else: .3 #################################################################################################################################### ## RULES #################################################################################################################################### Lot--> // make a rectangle from the initial shape, rescale it and align it innerRect s('0.7,'1,'0.7) center(xz) alignScopeToAxes(y) s('1,0,'1) Squareize Squareize --> // make the new rectangle shape into square, lenght of side is the shortest scope length case scope.sx == scope.sz: s('1,0,'1) center(xz) Footprint case scope.sx > scope.sz: s(scope.sz,0,scope.sz) center(xz) Footprint case scope.sz > scope.sx: s(scope.sx,0,scope.sx) center(xz) Footprint else: NIL Footprint--> // extrude the core case scope.sx * scope.sz > 500: extrude(coreHeight ) Tower else: NIL ################################ ################################ ## CORE AND SECTIONS ################################ Tower--> // insert the model i(fileRandom("assets/volumes/Rule5/*.obj")) //CORE split(z){ '0.1: NIL | '0.3 : s('.5, '1, '.5) center(xz) t(0,0,2) Mass | '0.2 : NIL | '0.3: s('.5, '1, '.5) center(xz) t(0,0,-10) Mass |'0.1: NIL } //SECTIONS split(z){ '0.1: NIL | '0.7: center(xz) s('1, sectionHeight, '1) RecursiveSections |~1: NIL } ############################### ############################### ## RECURSIVE SECTIONS ############################### RecursiveSections --> // ALTERNATIVE 1: DESIRED repeat the section and gap, while it touches the core case touches(intra) : split(y){ sectionRandomizer: Mass | gapRandomizer : NIL | ~1: RecursiveSections } else: NIL // ALTERNATIVE 2: CHECK turn off touches() to see if some of the sections touch the core /* split(y){ sectionRandomizer: Mass | gapRandomizer : NIL | ~1: RecursiveSections } */ ################################ ################################ ## MASS ################################ Mass--> // split up the mass into roof, base and sides alignScopeToAxes(y) center(xyz) comp(f) {horizontal: BasicRoof |all : WallAlignCheck } ################################ ################################ ## WALL ################################ WallAlignCheck--> // check the alignment (not sure how this part works, but it seems to work) alignScopeToGeometry(zUp, auto) alignScopeToAxes(y) split(y){0.01 : TinySplit // Workaround split to get a tiny horizontal edge, for vertical alignment | ~1 : Wall1 } Wall1--> // split odd shapes into more usual shapes (not sure how this part works, but it seems to work) convexify() comp(f){all: Wall2} Wall2--> // give it a nice color color("#ff0000") ################################ ################################ ## FRAME ################################ Frame--> // give it a nice color color("#ff0000") Done. ################################ ################################ ## TINY SPLIT ################################ TinySplit--> // give it a nice color color("#ff0000") Done. ################################ ################################ ## BASIC ROOF ################################ BasicRoof --> // leave it white Roof.
... View more
07-19-2012
05:12 AM
|
0
|
5
|
790
|
POST
|
doh, I was implementing bevelled edges in LOD 0 of my city, and I realized that I forgot to take out the extra bit: Lot -->
innerRect // ensure the lot is a square, for simplicity
alignScopeToAxes(y) // these two lines ensure that
s('1,0,'1) // the lot is extruded vertically (world axes, not the local axes)
extrude(10)
comp(f) {top: Bevel | side : Bevel} // splits out the individual faces
Bevel -->
roofHip(45) // each face becomes a hip roof,
split(y){.1: comp(f) {bottom: NIL | all : Wall } | ~1:NIL} // removes the bottom face (for efficiency), then removes the excess
Wall -->
color(0,5,0) // give it a pretty color :)
Done. // finished
... View more
07-16-2012
05:12 AM
|
0
|
0
|
1159
|
POST
|
Hi folks This may seem like a silly question, but I see that it is possible to import KMZ data into CityEngine, which is marvelous. For example, could I import a KMZ file like the following into CityEngine? 'North Korea Uncovered' -http://www.nkeconwatch.com/north-korea-uncovered-google-earth I can see how one can import a KMZ file (i.e. treat it like an OBJ) for an individual lot, but I'm puzzled how one could import the data for an entire city, or country. This would be awesome, though it may not be possible. Thank you!
... View more
07-07-2012
01:06 PM
|
0
|
1
|
352
|
POST
|
Thank you Matthias, excellent help 😄 I played around with your suggestion, and this is what I came up with to fit my needs. I share it here (liberally commented) because someone less experienced might find it useful. Lot -->
innerRect // ensure the lot is a square, for simplicity
alignScopeToAxes(y) // these two lines ensure that
s('1,0,'1) // the lot is extruded vertically (world axes, not the local axes)
extrude(10)
comp(f) {top: Bevel | side : Bevel} // splits out the individual faces
Bevel -->
roofHip(45) // each face becomes a hip roof, relative to the local axes
split(y){.1: comp(f) {bottom: NIL | all : Wall }} // removes the bottom face (for efficiency)
Wall -->
color(0,5,0) // give it a pretty color :)
Done. // finished
[ATTACH=CONFIG]15266[/ATTACH]
... View more
06-17-2012
01:37 AM
|
0
|
0
|
1159
|
POST
|
To make my building geometry look a bit more realistic, I'd like to chamfer / bevel all the edges in the model. This will just soften them slightly, and make them look just a bit more realistic when rendered... because the light reflects differently off chamfered corners, and few real-world objects have knife-sharp edges. Is there a simple way to do this? I suspect it involves comp(e), but I'm not sure after that....
... View more
06-14-2012
08:32 AM
|
0
|
4
|
3185
|
POST
|
thank you Matthias! Yes, I understand... 2D faces aren't picked up by the touches(), but 3D volumes work with touches(). So, looking at your rules, here is how your workaround works: 1. you extrude the flat 2D face to create a very small 3D volume. 2. you invoke the touches() instruction, it should work fine. 3. just delete the sides and top of the 3D volume, leaving the 2D face behind. Flipping brilliant, as I use CityEngine, I really do marvel at your brain frequently 😄
... View more
06-14-2012
08:29 AM
|
0
|
0
|
338
|
POST
|
howdy folks, here something that I don't quite understand. This is a test version of my rules, which is a greatly simplified version of the 5th Element New York city 😉 I'm using the 'touches()' to identify faces where the model penetrates itself. On these faces, for test purposes, I'd like to have a black texture. My rule seems to work, but only some of the time, as you can see in the photo. The black faces are working fine. I've put an arrow pointing at the faces where it should work, but doesn't (i.e. the faces should be black, but they aren't). By the way, I'm using 2010.3. Here is the extract from the rules: Wall --> case touches() : texture("facades/MyFacades/Test_facade_TOUCHES.png") alignScopeToGeometry(zUp, auto) setupProjection(0,scope.xy,10*getTileWidth(scope.sx),10*getFloorHeight(scope.sy),0) projectUV(0) else: texture("facades/MyFacades/Test_facade_WINDOW.png") alignScopeToGeometry(zUp, auto) setupProjection(0,scope.xy,10*getTileWidth(scope.sx),10*getFloorHeight(scope.sy),0) projectUV(0) As usual, your thoughts would be appreciated. Thank you! 😄
... View more
05-07-2012
12:44 PM
|
0
|
2
|
2496
|
POST
|
I'm trying to remember the lot dimensions, and later use it to translate a subset. I'm not sure why, but it doesn't work for me though. I'm getting an error: Undefined rule:set I'm using CityEngine 2010, maybe this wasn't a feature of this build?
attr LotScopeX = 0
Lot -->
set( LotScopeX, scope.sx )
Footprint
. // other script
t(lotScopeX,0,0)
... View more
04-18-2012
07:39 AM
|
0
|
0
|
460
|
POST
|
[ATTACH=CONFIG]13544[/ATTACH] Howdy - I'm hoping you can help. At the moment, I'm figuring out how to keep a texture vertically aligned, but projected flat onto a face. Normally, the rules I've put together below work fine, but (from what I read) it seems that faces without a horizontal edge at the bottom... give problems to the texture rotation. As you'll see from the photo, upside down triangles* are the issue, so the texture is projected flat (good) but rotated a bit skewed (which is bad) on that face (... it seems to be aligned with an edge). It is clear that you have solved this in the NYC 2259 example, but there is a lot of wizardry that I don't quite understand. Is there a more simple way to do this? Thank you! 😄 * It may be obvious to some, but for those who are puzzled, the triangles are caused by an imported shape that is formed from two pyramids, one inverted into the other. Those faces don't LOOK triangular, but the rest of the face is inside the structure so it is actually an upside down triangle [ATTACH=CONFIG]13535[/ATTACH] ################################ # FILES import flatroof : "flatroof.cga" ################################ # ATTRIBUTES attr LOD = 2 attr finalBuildingHeight = 100 attr floorH = rand(5,6) attr tileW = rand(2.2,3.7) ################################ # FUNCTIONS getWallATex = "facades/facade1_color.png" getFloorHeight(h) = case h >= floorH : h/rint(h/floorH) else : scope.sy/ceil(scope.sy/floorH+0.0001) getTileWidth(w) = case w >= tileW : w/rint(w/tileW) else : scope.sx/ceil(scope.sx/tileW+0.0001) ################################ # RULES Lot --> Footprint Footprint --> s('0.9,'1,'0.9) center(xz) alignScopeToAxes(y) s('1,0,'1) Mass Mass --> extrude(finalBuildingHeight) Shapes Shapes --> 10%: i( "volumes/cube_slanted_edges2.obj" ) comp(f){ side : Facade | horizontal : Roof } 10%: i( "volumes/cyl24_ver_bevel.obj" ) comp(f){ side : Facade | horizontal : Roof } 10%: i( "volumes/cyl8_ver.obj" ) comp(f){ side : Facade | horizontal : Roof } 10%: i( "volumes/o_shape.obj" ) comp(f){ side : Facade | horizontal : Roof } 10%: i( "volumes/prism1.obj" ) comp(f){ side : Facade | horizontal : Roof } 10%: i( "volumes/cube_taper_steps1.obj" ) comp(f){ side : Facade | horizontal : Roof } 10%: i( "volumes/u_shape.obj" ) comp(f){ side : Facade | horizontal : Roof } 10%: i( "volumes/cube_translated2.obj" ) comp(f){ side : Facade | horizontal : Roof } 10%: i( "volumes/cube_slanted_faces1.obj" ) comp(f){ side : Facade | horizontal : Roof } else: NIL Roof --> GetToItLater. Facade --> alignScopeToGeometry(zUp, auto) texture(getWallATex) setupProjection(0, scope.xy, 16*getTileWidth(scope.sx), 16*getFloorHeight(scope.sy), 1) projectUV(0) # colormap texture projection
... View more
04-15-2012
09:37 AM
|
0
|
4
|
1708
|
Online Status |
Offline
|
Date Last Visited |
11-11-2020
02:23 AM
|