OpenKeeper icon indicating copy to clipboard operation
OpenKeeper copied to clipboard

Implement wonky walls like in DK2

Open ufdada opened this issue 10 years ago • 18 comments

It's just a visual thing, but this would definitely make it look closer to the original.

This was actually achieved with Incremental Delaunay Triangulation.

Readings:

  • https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCYQFjAAahUKEwjf2KahpITJAhVGEiwKHWZYBqU&url=http%3A%2F%2Fwww.karlchenofhell.org%2Fcppswp%2Flischinski.pdf&usg=AFQjCNERvoyhQYMwgtVXdNJYlZukkk8Kiw&sig2=E83lExb014YunXw9nbgkpg
  • http://www.ti.inf.ethz.ch/ew/courses/CG13/lecture/Chapter%207.pdf
  • https://www.mi.fu-berlin.de/en/math/groups/discgeom/dates/2nd_ERC_Workshop/slides/inc3-talk.pdf

ufdada avatar Nov 09 '15 21:11 ufdada

Terrain has wibble & lean values. Both vertical & horizontal which probably contribute on how much wonkyness is applied. Stone doesn't have much, but regular dirt is all over the place.

tonihele avatar Nov 10 '15 06:11 tonihele

I used to think that this article was referenced somewhere on this repository, but I can't find it, @(tonihele) also commented on it. As did Robin Green (Ex-Bullfrog). Knowing when to split or flip.

https://simonschreibt.de/gat/dungeon-keeper-2-walls/

Also interesting: http://www.cs.uu.nl/docs/vakken/gis/terrain.pdf, points 5.1 and 5.2 detail how one could model terrain using Delaunay and keep on injecting vertices and flipping of illegal edges until a set of error-margins are satisfied.

Here I thought maybe one could see the "top" of the undug ground as 1 in height and the "floor" where the creatures run on and where you build on as height 0.

frame_1_delay-0 5s

I would assume that assigning an "error" margin of 0.1 to the vertices that should be lowered (thus go from 1 (top) to 0(bottom)) and as long as the error margin is not satisfied, repeat the process with the worst offender and make sure the triangulation stays Delaunay.

I also think maybe by using a little random offset to these error-margins x and z values., the wibble and lean might be used to randomize the shapes.

Delaunay Triangulation Where To Start: http://gamedev.stackexchange.com/questions/61424/delaunay-triangulation-where-to-start

Fast Delaunay in Java: https://www.duo.uio.no/bitstream/handle/10852/43535/delaunay_alg_performance.pdf?sequence=1

belgianguy avatar Jan 09 '17 00:01 belgianguy

Here is also a little something. Shader based wonkyness: https://keeperklan.com/threads/7062-Warped-walls-recreation?p=55292#post55292

tonihele avatar May 04 '19 10:05 tonihele

I also think they just used some simple vertex manipulations to create the effect. That still seems tricky to do in OpenKeeper though seeing how complicated the terrain rendering is. It's all done in many small chunks according to RenderDoc.

Trass3r avatar Dec 27 '19 01:12 Trass3r

Physics-wise I'm also routing for non shader based solution...

tonihele avatar Dec 27 '19 14:12 tonihele

Physics-wise I'm also routing for non shader based solution...

Not sure what you mean by physics, but just a reminder that they used perfect cube collision boxes. (collisions do not match the warping effect)

Unless your desire is to be even more accurate and better than DK2.

rainlizard avatar Dec 27 '19 21:12 rainlizard

Good catch. Didn't actually know that, but it makes sense. DK 2 doesn't really have physics in a sense. Everything is quite simple, such as shadows. But we were planning a bit to have Bullet physics. It will also make things maybe easier to implement even. If it totally breaks up the game, then not. But worth trying.

tonihele avatar Dec 27 '19 21:12 tonihele

Played around a bit with this warping effect: https://playground.babylonjs.com/#QMFPPE#250

Trass3r avatar Jan 31 '22 17:01 Trass3r

I think we should use Perlin noise (or another pseudorandom generator) because in the same vertices of adjacent block must have equal coordinatase. In editor tiles have attributes something like the value of entropy of pseudorandom generator

ArchDemons avatar Feb 01 '22 05:02 ArchDemons

That's easy. The problem is the vertex displacement will affect the normals and tangents.

Trass3r avatar Feb 01 '22 05:02 Trass3r

I just got reminded that I did implement something similar for a bloxel game engine written with jME. Though, I did it when creating the mesh, it might be getter to dispklace the grid in the shader.

RobertZenz avatar Feb 01 '22 06:02 RobertZenz

PoC with a slight offset: https://github.com/Trass3r/OpenKeeper/commits/wobblywalls image

Trass3r avatar Jul 22 '22 14:07 Trass3r

Already makes a huge difference, doesn't look so dull

tonihele avatar Jul 22 '22 16:07 tonihele

Yeah indeed. But it would better if you could extend the default materials/shaders somehow instead of all this copy paste, and you need a way to only assign the shader to map geometry and the selector wireframe (or a material parameter). For some reason it even affects the water and torches even though it shouldn't.

Trass3r avatar Jul 22 '22 17:07 Trass3r

The default shaders in jME are just that, they are very generic and support all features we don't really use. I would imagine that in the future we would just have bunch of custom light weight shaders for everything to provide that cool Dungeon Keeper 2 feeling. Hopefully with a modern twist of course.

tonihele avatar Jul 22 '22 18:07 tonihele

Yeah I just thought the same, sooner or later you'll have fully custom shaders anyway. Also need a custom pixel shader later to reconstruct the normals and tangents after vertex displacement: https://playground.babylonjs.com/#QMFPPE#373

Trass3r avatar Jul 22 '22 18:07 Trass3r