Keet
Advanced Member
Netherlands
Joined: Apr 8, 2022
Post Count: 1695
Status:
Offline
|
|
|
Re: Generate terrain from a room in batch mode / Hijacking the “Generate 3D terrain from rooms…” plug-in
|
The room’s native points follow the room move. Therefore, if we want to store a given elevation for a point in the room , one solution is, for example, to modify the point tag by introducing a Z value, for example <point x='3957.4912' y='32.531234' z='125.567'/> This Z elevation is only used for "Generate 3d terrain" and is therefore an absolute elevation relative to the ground level (does not depend on the level where the room is located) There's no need for that. The current way is sufficient. However, the numbers are not. Consider this awkwardly formed room with elevations:
<room id='room-c9710f39-3f72-4e5b-b04f-7a631eae29e3' level='level-dee204e2-b2ee-4226-86e8-a948f0498786' areaVisible='true' ceilingVisible='false' ceilingFlat='true'> <property name='terrainElevationAt(3820.14,797.00)' value='96.168'/> <property name='terrainElevationAt(3821.87,800.00)' value='96.668'/> <property name='terrainElevationAt(3847.28,750.00)' value='127.755'/> <property name='terrainElevationAt(3850.00,745.29)' value='130.027'/> <property name='terrainElevationAt(3850.00,750.00)' value='130.124'/> <property name='terrainElevationAt(3850.00,800.00)' value='119.72'/> <property name='terrainElevationAt(3850.00,848.71)' value='94.035'/> <property name='terrainElevationAt(3850.74,850.00)' value='93.698'/> <property name='terrainElevationAt(3876.15,700.00)' value='141.752'/> <property name='terrainElevationAt(3879.61,900.00)' value='72.723'/> <property name='terrainElevationAt(3900.00,658.69)' value='133.93'/> <property name='terrainElevationAt(3900.00,700.00)' value='157.147'/> <property name='terrainElevationAt(3900.00,750.00)' value='168.241'/> <property name='terrainElevationAt(3900.00,800.00)' value='153.723'/> <property name='terrainElevationAt(3900.00,850.00)' value='119.72'/> <property name='terrainElevationAt(3900.00,900.00)' value='78.924'/> <property name='terrainElevationAt(3900.00,935.32)' value='53.183'/> <property name='terrainElevationAt(3905.02,650.00)' value='130.785'/> <property name='terrainElevationAt(3908.48,950.00)' value='45.196'/> <property name='terrainElevationAt(3933.88,600.00)' value='112.458'/> <property name='terrainElevationAt(3937.34,1000.00)' value='22.492'/> <property name='terrainElevationAt(3950.00,1000.00)' value='22.612'/> <property name='terrainElevationAt(3950.00,1021.92)' value='15.443'/> <property name='terrainElevationAt(3950.00,572.09)' value='109.155'/> <property name='terrainElevationAt(3950.00,600.00)' value='118.271'/> <property name='terrainElevationAt(3950.00,650.00)' value='145.47'/> <property name='terrainElevationAt(3950.00,700.00)' value='173.218'/> <property name='terrainElevationAt(3950.00,750.00)' value='183.679'/> <property name='terrainElevationAt(3950.00,800.00)' value='167.082'/> <property name='terrainElevationAt(3950.00,850.00)' value='130.124'/> <property name='terrainElevationAt(3950.00,900.00)' value='85.783'/> <property name='terrainElevationAt(3950.00,950.00)' value='47.87'/> <property name='terrainElevationAt(3962.75,550.00)' value='113.391'/> <property name='terrainElevationAt(3966.21,1050.00)' value='8.963'/> <property name='terrainElevationAt(3970.14,1056.81)' value='7.772'/> <property name='terrainElevationAt(3974.08,1050.00)' value='8.868'/> <property name='terrainElevationAt(3991.62,500.00)' value='147.729'/> <property name='terrainElevationAt(4000.00,1000.00)' value='20.804'/> <property name='terrainElevationAt(4000.00,1005.10)' value='19.093'/> <property name='terrainElevationAt(4000.00,485.48)' value='162.761'/> <property name='terrainElevationAt(4000.00,500.00)' value='154.766'/> <property name='terrainElevationAt(4000.00,550.00)' value='132.356'/> <property name='terrainElevationAt(4000.00,600.00)' value='128.206'/> <property name='terrainElevationAt(4000.00,650.00)' value='142.999'/> <property name='terrainElevationAt(4000.00,700.00)' value='163.031'/> <property name='terrainElevationAt(4000.00,750.00)' value='170.233'/> <property name='terrainElevationAt(4000.00,800.00)' value='153.723'/> <property name='terrainElevationAt(4000.00,850.00)' value='119.72'/> <property name='terrainElevationAt(4000.00,900.00)' value='78.924'/> <property name='terrainElevationAt(4000.00,950.00)' value='44.042'/> <property name='terrainElevationAt(4002.94,1000.00)' value='20.595'/> <property name='terrainElevationAt(4020.49,450.00)' value='202.105'/> <property name='terrainElevationAt(4031.81,950.00)' value='38.298'/> <property name='terrainElevationAt(4049.35,400.00)' value='241.743'/> <property name='terrainElevationAt(4050.00,398.88)' value='242.187'/> <property name='terrainElevationAt(4050.00,400.00)' value='242.253'/> <property name='terrainElevationAt(4050.00,450.00)' value='227.345'/> <property name='terrainElevationAt(4050.00,500.00)' value='188.213'/> <property name='terrainElevationAt(4050.00,550.00)' value='147.697'/> <property name='terrainElevationAt(4050.00,600.00)' value='124.745'/> <property name='terrainElevationAt(4050.00,650.00)' value='123.129'/> <property name='terrainElevationAt(4050.00,700.00)' value='131.671'/> <property name='terrainElevationAt(4050.00,750.00)' value='134.169'/> <property name='terrainElevationAt(4050.00,800.00)' value='120.879'/> <property name='terrainElevationAt(4050.00,850.00)' value='93.238'/> <property name='terrainElevationAt(4050.00,900.00)' value='61.466'/> <property name='terrainElevationAt(4050.00,918.50)' value='50.508'/> <property name='terrainElevationAt(4060.68,900.00)' value='57.025'/> <property name='terrainElevationAt(4078.22,350.00)' value='236.295'/> <property name='terrainElevationAt(4089.55,850.00)' value='67.992'/> <property name='terrainElevationAt(4100.00,312.28)' value='201.889'/> <property name='terrainElevationAt(4100.00,350.00)' value='240.06'/> <property name='terrainElevationAt(4100.00,400.00)' value='262.368'/> <property name='terrainElevationAt(4100.00,450.00)' value='244.331'/> <property name='terrainElevationAt(4100.00,500.00)' value='197.64'/> <property name='terrainElevationAt(4100.00,550.00)' value='145.863'/> <property name='terrainElevationAt(4100.00,600.00)' value='109.299'/> <property name='terrainElevationAt(4100.00,650.00)' value='93.955'/> <property name='terrainElevationAt(4100.00,700.00)' value='91.915'/> <property name='terrainElevationAt(4100.00,750.00)' value='90.18'/> <property name='terrainElevationAt(4100.00,800.00)' value='80.184'/> <property name='terrainElevationAt(4100.00,831.89)' value='68.598'/> <property name='terrainElevationAt(4107.09,300.00)' value='186.646'/> <property name='terrainElevationAt(4118.41,800.00)' value='66.159'/> <property name='terrainElevationAt(4120.14,660.23)' value='79.825'/> <property name='terrainElevationAt(4120.14,797.00)' value='65.623'/> <property name='terrainElevationAt(4120.63,650.00)' value='81.332'/> <property name='terrainElevationAt(4123.03,600.00)' value='99.195'/> <property name='terrainElevationAt(4123.14,800.00)' value='62.749'/> <property name='terrainElevationAt(4125.42,550.00)' value='137.786'/> <property name='terrainElevationAt(4127.82,500.00)' value='190.079'/> <property name='terrainElevationAt(4130.22,450.00)' value='235.927'/> <property name='terrainElevationAt(4132.61,400.00)' value='252.842'/> <property name='terrainElevationAt(4135.01,350.00)' value='230.452'/> <property name='terrainElevationAt(4135.96,250.00)' value='118.053'/> <property name='terrainElevationAt(4137.40,300.00)' value='178.442'/> <property name='terrainElevationAt(4139.80,250.00)' value='116.913'/> <property name='terrainElevationAt(4140.14,242.75)' value='108.442'/> <property name='terrainElevationAt(4150.00,677.47)' value='58.612'/> <property name='terrainElevationAt(4150.00,700.00)' value='55.994'/> <property name='terrainElevationAt(4150.00,750.00)' value='51.915'/> <property name='terrainElevationAt(4150.00,800.00)' value='45.201'/> <property name='terrainElevationAt(4150.00,826.86)' value='39.314'/> <property name='terrainElevationAt(4173.14,850.00)' value='24.748'/> <property name='terrainElevationAt(4189.03,700.00)' value='34.852'/> <property name='terrainElevationAt(4200.00,706.33)' value='29.409'/> <property name='terrainElevationAt(4200.00,750.00)' value='25.763'/> <property name='terrainElevationAt(4200.00,800.00)' value='20.804'/> <property name='terrainElevationAt(4200.00,850.00)' value='16.202'/> <property name='terrainElevationAt(4200.00,876.86)' value='13.224'/> <property name='terrainElevationAt(4223.14,900.00)' value='8.254'/> <property name='terrainElevationAt(4250.00,735.20)' value='11.888'/> <property name='terrainElevationAt(4250.00,750.00)' value='11.118'/> <property name='terrainElevationAt(4250.00,800.00)' value='8.319'/> <property name='terrainElevationAt(4250.00,850.00)' value='7.875'/> <property name='terrainElevationAt(4250.00,900.00)' value='6.064'/> <property name='terrainElevationAt(4250.00,926.86)' value='5.102'/> <property name='terrainElevationAt(4273.14,950.00)' value='4.29'/> <property name='terrainElevationAt(4275.63,750.00)' value='6.87'/> <property name='terrainElevationAt(4300.00,764.07)' value='4.344'/> <property name='terrainElevationAt(4300.00,800.00)' value='4.765'/> <property name='terrainElevationAt(4300.00,850.00)' value='5.15'/> <property name='terrainElevationAt(4300.00,900.00)' value='5.242'/> <property name='terrainElevationAt(4300.00,950.00)' value='4.127'/> <property name='terrainElevationAt(4300.00,976.86)' value='4.029'/> <property name='terrainElevationAt(4323.14,1000.00)' value='5.078'/> <property name='terrainElevationAt(4350.00,1000.00)' value='6.804'/> <property name='terrainElevationAt(4350.00,1026.86)' value='6.073'/> <property name='terrainElevationAt(4350.00,792.94)' value='3.25'/> <property name='terrainElevationAt(4350.00,800.00)' value='3.493'/> <property name='terrainElevationAt(4350.00,850.00)' value='5.299'/> <property name='terrainElevationAt(4350.00,900.00)' value='6.804'/> <property name='terrainElevationAt(4350.00,950.00)' value='7.395'/> <property name='terrainElevationAt(4362.24,800.00)' value='3.928'/> <property name='terrainElevationAt(4373.14,1050.00)' value='6.56'/> <property name='terrainElevationAt(4400.00,1000.00)' value='10.321'/> <property name='terrainElevationAt(4400.00,1050.00)' value='8.038'/> <property name='terrainElevationAt(4400.00,1076.86)' value='6.56'/> <property name='terrainElevationAt(4400.00,821.80)' value='6.486'/> <property name='terrainElevationAt(4400.00,850.00)' value='8.038'/> <property name='terrainElevationAt(4400.00,900.00)' value='10.321'/> <property name='terrainElevationAt(4400.00,950.00)' value='11.218'/> <property name='terrainElevationAt(4423.14,1100.00)' value='6.073'/> <property name='terrainElevationAt(4448.84,850.00)' value='10.28'/> <property name='terrainElevationAt(4450.00,1000.00)' value='13.252'/> <property name='terrainElevationAt(4450.00,1050.00)' value='10.321'/> <property name='terrainElevationAt(4450.00,1100.00)' value='6.804'/> <property name='terrainElevationAt(4450.00,1126.86)' value='5.078'/> <property name='terrainElevationAt(4450.00,850.67)' value='10.367'/> <property name='terrainElevationAt(4450.00,900.00)' value='13.252'/> <property name='terrainElevationAt(4450.00,950.00)' value='14.404'/> <property name='terrainElevationAt(4473.14,1150.00)' value='4.029'/> <property name='terrainElevationAt(4500.00,1000.00)' value='14.404'/> <property name='terrainElevationAt(4500.00,1050.00)' value='11.218'/> <property name='terrainElevationAt(4500.00,1100.00)' value='7.395'/> <property name='terrainElevationAt(4500.00,1150.00)' value='4.127'/> <property name='terrainElevationAt(4500.00,1176.86)' value='2.816'/> <property name='terrainElevationAt(4500.00,879.54)' value='13.268'/> <property name='terrainElevationAt(4500.00,900.00)' value='14.404'/> <property name='terrainElevationAt(4500.00,950.00)' value='15.655'/> <property name='terrainElevationAt(4509.05,1185.91)' value='2.442'/> <property name='terrainElevationAt(4518.68,1150.00)' value='4.079'/> <property name='terrainElevationAt(4532.07,1100.00)' value='7.146'/> <property name='terrainElevationAt(4535.44,900.00)' value='13.813'/> <property name='terrainElevationAt(4545.47,1050.00)' value='10.471'/> <property name='terrainElevationAt(4550.00,1000.00)' value='13.252'/> <property name='terrainElevationAt(4550.00,1033.09)' value='11.442'/> <property name='terrainElevationAt(4550.00,908.41)' value='13.596'/> <property name='terrainElevationAt(4550.00,950.00)' value='14.404'/> <property name='terrainElevationAt(4558.87,1000.00)' value='12.832'/> <property name='terrainElevationAt(4572.27,950.00)' value='13.154'/> <property name='terrainElevationAt(4578.93,925.11)' value='12.459'/> <property name='terrainGridSize' value='50.0'/> <point x='4140.144' y='242.74615'/> <point x='3820.144' y='797.00244'/> <point x='3970.144' y='1056.81'/> <point x='4120.144' y='797.00244'/> <point x='4509.0527' y='1185.9111'/> <point x='4578.934' y='925.11115'/> <point x='4120.144' y='660.2286'/> </room>
All elevation points are fixed and have no relation to the actual position of the room. If you move the room and generate again all elevation points are still considered to be at the original position. THAT is what should change. The software already has code to calculate the x and y coordinates of the bounding box of the furniture, even if that furniture is not a square form. This means that the object is positioned with just a single coordinate pair (x,y). For this awkward room that point would be (3199.5, 714.3). (Generate the terrain and the resulting terrain is 'furniture' with a bounding box that has these coordinates.) The way the elevation points should have been stored is with values relative to 0,0 using the coordinates of the virtual bounding box of the room. When that is done you can move the room and re-generation will use the new bounding box coordinates and generate the exact same terrain at the new room position. You could change
<property name='terrainElevationAt(4535.44,900.00)' value='13.813'/> to
<property name='terrainElevationAt(4535.44,900.00,13.813'/> or
<property name='terrainElevationAt' x='4535.44' y='900.00' z='13.813'/>
but it's just another way of storing the same data. All in all this is just a minor problem since you should create terrains in a separate project where you don't have to move the rooms. You generate the terrain(s) and can freely move those objects in the original project.
That doesn't solve locking points. As you already determined that requires changing of the UI to allow locking of a selected point. That is the easy part. It could be stored as
<property name='terrainElevationAt(4535.44,900.00)' value='13.813' locked='true'/>
The difficult part is to generate new elevations that take the locked points into account while still smoothly elevating around them. You will have to check each point before changing it's elevation and disallow a change if the point is locked. I doubt it is as easy as I describe this.
One solution could be (it's probably/certainly not the best): proceed as currently (without considering the Locks) and at the end check if a point elevation with a Z value has been modified , and if so, we simulate a complementary action on that point to return its elevation to its Z value (with the same parameters : radius of action, linearity, etc.). However, in this case, pay attention to infinite loops if two points with Z values are close together... Definitely a bad solution and very bad programming practice. You never change a value you have to change back afterwards on an already known condition, you prevent a change using that condition in the first place. I don't see where you could get infinite loops, each point in the given radius is processed and a value is set. I haven't checked the source code but I don't think there's any looping to execute elevation changes.
As a (temporary?) solution you can open the generated terrain in Blender and move any face or vertice you want. Of course this doesn't get stored in the room so it is just a partial solution. This is where the roof generator is superior: roofs are generated using a room but once generated you can select the roof object and start the roof generator again and it will read all vales from the roof object to make changes, without the need of the original room. It's something I desperately want for the Generate 3D shape plugin!
----------------------------------------
Dodecagon.nl 1300+ 3D models, manuals, and projects
|