Welcome to od|forum

Register now to gain access to all of our features. Once registered and logged in, you will be able to contribute to this site by submitting your own content or replying to existing content. You'll be able to customize your profile, receive reputation points as a reward for submitting content, while also communicating with other members via your own private inbox, plus much more! This message will be removed once you have signed in.


  • Content count

  • Joined

  • Last visited

  • Days Won


Everything posted by hyperforce

  1. And here is the second article: https://80.lv/articles/procedural-world-building-in-ghost-recon-wildlands/ I go over the workings of some of our most intricate tools Hope you enjoy the read.
  2. I'm trying to detect if a group exists in a specific node so it can return a 0 or 1 value for a switch node. According to the houdini help index I should use an OPEXIST expression and mark my group with @group as follows: Returns 1 if the specified node, group, or bundle exists. Usage opexist(op_name) Examples echo `opexist("../box1")` echo `opexist("/obj/@mygroup")` echo `opexist("@mybundle")` But I can't seem to get it to work properly. Whenever I add a @ symbol into my op_name path, it turns green and always returns 0. I've tried to specify the full path and I tried using backticks and several other methods, but it doesn't seem to detect if my groups exist or not. Does anyone know how to use this expression, or if another expression exists that does the same thing.
  3. Think about taking a set of curves and extruding them outwards, creating roads that interlink correctly.
  4. I'm looking into creating something using reversed straight skeleton. However no-one but you seems to have found a workable method within Houdini that I can tell. Is there any chance you would write a tutorial or release your straight skeleton method. I checked your file on orbolt, but its a file that even if I were to pay 130 dollars It won't allow me to learn from it. I'd rather pay for a tutorial than for a tool I can't learn from.
  5. I would suggest using the find shortest path SOP. If you provide it with a proper grid of your terrain it can do exactly what you need. I tend to create these grids using a attribwrangle node. Have a look at the findshortest path advanced example for that. For rivers I would use a flowmap to set the cost of the paths, also to make them one directional, since you don't want your rivers to flow uphill. Next to that to set the start and end points. And if you need more help send me a PM, I can give you some pointers on how to make it do what you want.
  6. I would try to use the attribWrangle node and vex code in combination with a find shortest path node. I won't be able to provide you with an example right away, but I'll try to describe the way to do it: There are 2 ways I can think of to do this: 1: This method will work well for the example image of the initial post: By creating a single step - nearest point connection vex script, and then running the find shortest path over that to order your points. Use an AttribWrangle and make it do a point cloud operation to store the points within a certain distance to the current point in an array. Then loop through the array, give every point a temporary variable of VALID = 1. This loops through the array of points found by the current point. Now perform checks for each found point using if statements. If the point number found is the current point being processed set its valid state to 0. If the point found has a point number lower then the current point set it valid state to 0. Then using an if statement, push the point numbers of only the valid points into a new array. Then exit the loop. Outside the loop, find the point number in the array with the lowest and highest value. Now create a primitive using vex (a two vertex polygon line) between the lowest valid point number and the current point number. Do the same with the highest valid point number. If a point does not have any valid targets due to the culling, skip it. Now you will have a system that constructs a maximum of 2 lines per point. This won't be perfect, as it can do branches, but the trick now is to use the start of your curve, (ensure there the shape you just generated is not closed, it has to have a end and start). Use the find shortest path node's distance function to write out the distance from the start point on your curve. Then, delete away the primitives, sort the points by this distance attribute and use an add node to connect everything together. And there you have it, one curve created from your point cloud image. 2: This method is slightly different, and is best suited if you want to create a curve through a curve through a dense point cloud. you can make a cloud-grid using the nearest point connection vex script described above with some changes. But this one is simpler, simply make it do a connection to every point in range (every point in the point cloud array it finds). This will connecting all the points to their nearest neighbors. You can then use the find shortest path node to navigate the grid. You can do this using way points if you do not need it to navigate every point in your cloud, or using a negative cost per point. This last method will do the traveling salesman method, where it attempts to pass through every point in your grid at least once.
  7. So far I've only seen these new functions in their pure VEX form inside wrangle nodes. Adding an attribute in VOPs should be as simple as an ADDATTRIB, or BIND VOP though.
  8. A function for the resample SOP that allows curves to be resampled based on an attribute on the original curve. (Allowing a curve with variable resample distances, so certain areas have a higher concentration of points then others).
  9. Version 198 is still pretty buggy, but its a version that's (judging by the version number) already a few weeks old. So i'm expecting the next daily build to have fixed several bugs. Any bugs you encounter, make sure you submit them to the bug tracker on sidefx.com The more bugs can be identified quickly, the faster they can be fixed.
  10. By default its Heuristics are set to A* but you can change that to act like Dijkstra's Algorithm by typing 0 (*zero) in the heuristics field. Its also got functionality for custom point, edge and turning cost, directional connections (based on vertex order), forced connections and connections to avoid. It can output one path, several paths from a start to multiple ends, or a path from each start to each end respectively. By specifying a second input, and setting the start and end point number to 0 and 1 (instead of a group name) the pathfinder will use the closest point on input 1 (the grid) to these respective point numbers from input 2 (for example a curve). This allows for a fast, interactive workflow. Finally it can export the distances across the grid based on this setting and export distances from all points to the closest start point, or export distances through a large array attribute for each point to each other point. Finally, the entire algorithm uses a pre-computed look up table method, making it extremely fast, easily able to deal with a large amount of data quickly. Look up the examples in the help files from some in depth examples.
  11. I just read about the PolyCut node YES!!!
  12. Do check the new FindShortestPath SOP. Its a very impressive pathfinder with tons of features.
  13. To my knowledge unloading is only really effective if you are not doing a recursive or manual operation on or from an unloaded node. Otherwise it will have to recook the node constantly and with recursive nodes it can increase cooking time significantly. Starting from Houdini 13 you'll be able to create polygonal geometry using Wrange nodes. Things like making curve connections between points based on distance is really neat, and it can be made 100x faster & memory efficient with a wrangle node then doing it with a for-each node.
  14. Very impressive tool, UV'ing isn't one of Houdini's strongest points, so this could come in handy.
  15. I'm trying to blend together several curves. These curves have been deformed from a base curve, I wish to have these curves blend together in Y based on their weight attributes. Think of the snap to average point position function of the fuse node, but then with weight taken into account. In its simplest form I have 2 or more points, that need to be replaced by a point in their weighted average position. To clarify. here is an example: Point 1 is at Y = -10 with 90% influence Point 2 is at Y = 15 with 50% influence Point 3 is at Y = 5 with 20% influence Does anyone here know if there is a node that does this, or otherwise, what mathematical formula I need to use to solve this problem.
  16. The ability to fuse and snap points not only on average point position or highest/lowest point number, but also based on a weight attribute. So a point with 90% weight will only be displaced slightly while a 50% weight is displaced far more. Like tug of war, the strongest contender is moved the least. Attributes on the fused points could be blended in the same way. The node could also include options for MIN, MAX, MODE, besides BLEND. So if 2 curves are fused with say 2 different colors values, using BLEND it will blend the fused points colors in a weighted way. If set to MAX or MIN however, the color from the curve with the with the highest or lowest weight could be kept.
  17. Thanks Kim and Twan. I need it to be able to blend between a variable range of curves so a simple hardwire won't work. I did find a mathmetical formula to do it with. Take the weighted offset of each curve/point. Add these weighted offsets together. Also add the weights together. Divide the sum of the weighted offset by the sum of the weight. And the value you get back is the weighted average. I haven't worked much with chops so far, I need to have another look at those.
  18. I'm trying to write a set of values to a set of of points using the attribWrangle node and VEX. These points are processed using a for loop that deals with each point number in sequence. However, when I use the default @foo = value; function it simply overwrites the values of the foo attribute for all the points, not just the one my for loop is processing. This leaves me with all my points containing the attribute values of the last processed iteration. I know that with a point function you can extract the attribute value of a specific point.Can you also write it, using vex in a attribWrangle sop?
  19. Nice work, I like your road network you did for your specialization. The level generator takes a different approach from mine, in that it doesn't follow game-play rules. But for interior level environment generation it is a good first step. And the fact that you wrote your own exporter is of course very impressive as well. Again congratulations on passing your exam.
  20. This procedural level design tool is the result of my graduation project and my dissertation study into: “The rules behind a procedural death match map generator”. This project earned me a 10 and allowed me to graduate Cum Laude (with distinction) from the University of Applied Sciences in Breda. It earned me the title of Bachelor of Engineering in Game Architecture & Design. This Thread has been updated following the completion of my Graduation project. This tool is designed to create fully playable complex 3D combat arena's for the Unreal Development Kit, with minimal user / designer input. But without taking away control. It allows for rapid iteration and testing, using a user-mediated construction method. With this tool, a level designer becomes a digital director. The generator constructs levels following the death match game-type rule sets of Unreal Tournament 3 and the UDK, discovered during my dissertation ( Specifically "Axon" faction levels). It is capable of creating fully traverse-able, multi-leveled, interior 'white-boxed' maps. Including path nodes, player starts, logically distributed pickups and decorative meshes. Think of it as a 3D sketch pad for level designers, where the results can be immediately play-tested. The tool is fully procedural, and the results can be exported directly to the UDK using the .OBJ and .T3D file formats. The generator is highly modular and can be expanded and adjusted easily to support other game-types or games. Many components of the generator have also been improved over the course of my graduation period. The user interface and workflow have been significantly tightened and are now easier to use. It features 3 levels of control, ranging from highly automated to deep manual control. When using only random results and manual overrides, the tool can be used to rapidly browse through and tweak possible level layouts in order to quickly prototype unique levels. While using manual input allows for deep and detailed control over every part of the process. A designer can have as much control over the final result as he/she wishes. The tool uses a user-mediated approach to procedural level construction, meaning that it requires a designer to determine the shape and layout of a level he/she wishes to create. The actual construction of said level however is fully automated. How it works: The tool is mainly based on volume conversion (Houdini's Voxels) and constructs a level according to a 3D grid. After the main landmark spaces are generated, corridor profile curves are established between them using a path finding algorithm written specifically for this generator by Leroy Sikkes. Following this, the corridors are assembled from a series of components by analyzing the profile curves. Where corridors interconnect, minor rooms are generated. Finally, the combined level mesh is processed to form an internal grid, which is used to create catwalks and ramps. The finished level mesh is automatically UV'd to identify different area's and the mesh is optimized. Various objects can be automatically or manually placed throughout the level. These objects by default will always try to ensure the spaces they are placed in remain traverse-able. Place-able objects include: pillars, columns, low cover objects, box stacks & railings. Next a path grid is generated throughout the level for AI navigation and pickup placement. This is done in layers, each representing a different form of player navigation. Using these layers and the level geometry, each point in the grid is analysed and compared to the rest of the level for the following data: Exposure, Space to move, Distance to Walls, Height advantage & Reach-ability. This data is used to calculate the risk or tactical value of each point on the grid. A designer can then designate a series of hot-spots. These hot-spots are locations that the designers wants to attract players towards. This can also be done automatically if so desired. A designer can let the tool create a random pickup load-out for the level, or specify his/her own pickups. Each pickup definition in the load-out menu as well as each pickup archetype has its own placement rules. Based on the pickups placement definitions, the risk grid and hot-spots in the level; pickups are logically distributed throughout the level. During the final step, the level geometry is subdivided and cleaned. The size of each segment is calculated and a series of meshes are assigned to their respective surface. All a designer has to do to play the level is export it from Houdini using the OBJ and T3D format & import the files into the UDK and build the pathing. This can be done in less than 5 minutes. The .T3D exporter used in Houdini is currently under development by Jan Pijpers. The main node graph of the level geometry generation (steps 1-6): http://img831.images...generatorgr.jpg For in depth information about how this part of the project was created, see my dissertation: Compressed: 23.5 MB: https://rapidshare.c...issertation.pdf Uncompressed: 77,5 MB: https://rapidshare.c...ertation_HQ.pdf For further information on how the generator is used, see the user manual: 12 MB: http://rapidshare.co...USER MANUAL.pdf Contact me at: Erwin Heyms Technical & Procedural Level Designer Erwinheyms@gmail.com (+31) 644101169 My Portfolio and Curriculum Vitae: 30,1 MB: http://rapidshare.co..._Vitae_2013.pdf My Linked-in Page: http://www.linkedin....eyms/24/687/243 A half hour presentation at the Global Game Jam - January 2013, that go's into depth on the project: [media] [media]To clarify, this tool does not "design" levels on its own, but it is based on the design rules discovered during my dissertation study. It employs a user-mediated approach, meaning that it requires a designer to determine the shape and layout of the level he/she wishes to create. The actual construction of said level however is automated. Randomized results can be used (to quickly explore possible solutions) during many of the steps in the process, but it is by no means required. A designer can have as much control over the final result as he/she wishes. Simply put: this tool enables a designer to rapidly prototype a level from the idea stage, to a play-testable stage, within only a fraction of the time it would have otherwise taken him/her. This procedural level design tool has several interesting utilities. Primarily, it is a tool that allows for the rapid generation of white box quality death match levels. Using it, a designer can quickly “sketch” out a level, make adjustment and play-test the result within only a fraction of the time it would have taken using a manual process. Secondly, with further polish and development, a generator such as this prototype could be integrated into a first or third person shooter. This could allow players to create their own combat arena’s without the need for complicated level editing software or level design experience. Furthermore, players could share their levels online, and download the best rated levels from other players, allowing for a nearly unlimited supply of levels and a longer game lifespan. With special thanks to: - Nathan Danïels, Elroy Aarts, Jesse Ravenbergen, Richard v. Beersum, Thomas Buijtenweg & Wytze van Balkom: Playtesting & Data capture. - Kim Goossens: My Houdini supervisor. - Ronny Franken: My level design supervisor. - Andrew Paquette: My art Supervisor. - Leroy Sikkes: Pathfinding Algorithm Script. - Jan Pijpers: Creator of the .T3D Houdini to UDK exporter. *Total accumulated cooking time of the demonstrated level inside Houdini took roughly 8 minutes. Construction of the level in my show reel took in between 2-3 hours + and hour of tweaking. NHTV International Game Architecture and Design The academy of Digital Entertainment
  21. I have added my presentation at the global game jam: - presentation intro - project description - workflow - project construction - questions
  22. My apologies for those that have been trying to download from my rapid-share account through the links above. Apparently rapid-share has changed its download policies over the past few months and I had to open them up again so third parties could download them. In the next few days I'll upload a presentation I did at my Uni. that go's into more detail on the project. More on this soon.
  23. I agree with you that it would be simpler for a purely manual approach. But how would this system hold up when you also want the generator to create rooms for you that you can then manually adjust? The generator HDA would have to talk back to the handle HDA's it just created and vice-versa... I'm not sure how viable or temper proof that is. And those rooms are just the simplest example. In any case,handles aren't the only thing that needs to be updated. Its not possible to talk to the add/remove/tabs of a multi-parm for example, and its also currently impossible to retrieve the tab # that is currently selected like radio buttons. I've even asked people from side-fx directly if this was possible and even they didn't have an answer.
  24. For me, Houdini needs more support for creating custom HUD based manipulators and controls in combination with better visual feedback. If Houdini is to break into the game industry as a cutting edge software package it needs these elements as the current control system with the parameter pane is too programmer oriented. (This is also feedback I received from Guerrilla games level designers and developers). While it is possible to do some of these things in a round about way using python and H-script it is still limited. The following is a little hard to explain in text but i'll try: When I want to for example create a new room in my level generator (see the link in my signature), I need to go to the parameter menu, and increment a number to let a for-loop generate another room. To control this room I need a multi-parm folder structure as I might need controls for 5 rooms, or 50. If I want to change the position, rotation or scale of this room i need to do it through the multi-parm menu, find the right tab in the list that corresponds to the room I want to manipulate, and then adjust the respective sliders. This isn't very intuitive. As an alternative for the for loop and increment number, I could use an add node to move the room around with the add node's move handle. I could even use some python scripts to automate some of these elements but I'd still need to link these to a multi-parm folder. Any custom handle created with the type properties menu of a digital asset doesn't work with multi-parms. I also can't make persistent handles for multi-parm parameters. so i'm suck here. Then, say I want to remove this room, but I already created a series of other rooms after these. When I remove the room point or decrease room count, all the controls shift back along by one. This is especially messy if random seeds are involved that link to a rooms number or ID. In either case, it could mess everything up even further. So this it what I'd like to see: I would like to see the handle tool (or some other form of manipulator) to be configurable so it supports the addition, manipulation and deletion of objects from multi-parm instanced controls. Parameters inside these multi-parm folder lists and the multi-parm folders themselves need to be configurable in the editor (parameter editor / type properties) so I can assign them custom handles or manipulators. I would also need the ability to manipulate/read out the selected tabs and activate the add/remove buttons from the multi-parm remotely. This would be required to manipulate each entry in the multi-parm list from the scene view handle tool. So when I add a new parameter to my multi-parm list in say the type properties, I can tell it to create a custom move handle when prompted or link the parameter to a onscreen slider. In a similar way I would like to link the multi-parm folder to a drop down menu on the handle tool. So I can select elements in my scene, or right click to add/remove them. Imagine that instead of having to use only the parameter menu to add a new room, I could simply: Right click in my viewport using the handle tool and be able to select, CREATE > ROOM. This would then increment the number of rooms, so it creates a new room and add a new entry to the multi-parm list, so I have the corresponding controls for this room. It would also immediately set the translation of the room to the position where I clicked. So now I have a room, with only 1 action. I can then select this room by using the handle tool again. When I hover over the room, it highlights to indicate it is selectable. When I click it, it selects the room and creates a halo effect around it to indicate this in the scene view. This will automatically call up the right tab of controls in the multi-parm. In a similiar way, if I click or hover over the tab in the multi-parm. the Room in the scene view highlights. Now I have the room selected, I can use a series of on-screen sliders/handles to quickly manipulate all the enabled parameters of the multi-parm. Such as call up a scale handle to scale the room, or a rotate handle etc. change the amount of height levels the room has, enable mirroring, etc. These handles appear and vanish only when called for so you don't have 10 persistent handles on the screen for different rooms or settings you are not manipulating. If i were to remove this room by right clicking it and specifying DELETE ROOM it reduces the room count correctly and removes the correct entry in the multi-parm list so the controls still line up. To conclude: The more an artist can do in the viewport with context sensitive controls, the better it will be as a tool in the games industry. Game designers or level designers don't like it when a tool is not intuitive or offers so many sliders it boggles the mind. One quote i got from Guerrilla was this: If you run an ice cream shop and you have 3000 flavors and you display all of them. People will become confused and leave your store without buying anything. If you only display a limited amount of flavors and only show the other flavors related to the one they picked when people are looking into them, it becomes much easier to manage for them. So the better and more intuitive I as a Houdini artist can make the control system, the better it will be received.
  25. Everything, except for the final decorative meshes, are Houdini smart assets. The final decorative meshes are prefabs made in another modeling program. It is possible to provide your own meshes for the landmark rooms as well if you wish. These will have to be provided in the form of one or more fully enclosed meshes (preferably 4 directional), but it is not required. The corridor and catwalk components will re-scale themselves based the grid size and corridor width/height. The cover objects are also smart assets constructed in Houdini. They can be re-scaled and deformed.