IceCreamYou/THREE.Terrain

adding physics or collision to generated terrain

Opened this issue · 3 comments

alright im just going to say i love the way this works and its great but there is one thing i have a problem with how in the world do you add physics to it or like make it solid so my player wont fall through it when i use physi.js

I suggest starting from this example. The only difference is that you should use the plane geometry generated by THREE.Terrain instead of the custom one that is generated in that example.

sir it will not work for me i have done this so far

    var ground_material = THREE.Terrain.generateBlendedMaterial([
        // The first texture is the base; other textures are blended in on top.
        {
            texture: THREE.ImageUtils.loadTexture("textures/grass.jpg")
        },
        // Start blending in at height -80; opaque between -35 and 20; blend out by 50
        {
            texture: THREE.ImageUtils.loadTexture("textures/rock.jpg"),
            levels: [20, 20, 240, 250]
        }, {
            texture: THREE.ImageUtils.loadTexture("textures/grass.jpg"),
            levels: [-20, 5, 5, 10]
        }, {
            texture: THREE.ImageUtils.loadTexture("textures/snow.jpg"),
            levels: [250, 260, 290, 300]
        }, {
            texture: THREE.ImageUtils.loadTexture("textures/rock.jpg"),
            levels: [200, 210, 300, 300]
        },
        // How quickly this texture is blended in depends on its x-position.
        {
            texture: THREE.ImageUtils.loadTexture("textures/grass.jpg"),
            glsl: '1.0 - smoothstep(65.0 + smoothstep(-256.0, 256.0, vPosition.x) * 10.0, 80.0, vPosition.z)'
        },
        //Use this texture if the slope is between 27 and 45 degrees
        {
            texture: THREE.ImageUtils.loadTexture("textures/rock.jpg"),

            glsl: 'slope > 0.7853981633974483 ? 0.2 : 1.0 - smoothstep(0.47123889803846897, 0.7853981633974483, slope) + 0.2'
        },
    ]);

    var xS = 200,
        yS = 200;


    ground_geometry =
        new THREE.Terrain({
            easing: THREE.Terrain.Linear,
            frequency: 2.5,
            heightmap: THREE.Terrain.Hill,
            material: material,
            maxHeight: 1000,
            minHeight: -1000,
            steps: 10,
            useBufferGeometry: false,
            xSegments: xS,
            xSize: 90000,
            ySegments: yS,
            ySize: 90000,
        })


    // If your plane is not square as far as face count then the HeightfieldMesh
    // takes two more arguments at the end: # of x faces and # of y faces that were passed to THREE.PlaneMaterial
    ground = new Physijs.HeightfieldMesh(
        ground_geometry,
        ground_material,
        0, // mass
        50,
        50
    );

i keep getting this error geometry.computeBoundingBox is not a function

Unfortunately this is not a support forum and I can't help you write code for a third party library. I suggest posting on Stack Overflow or somewhere similar. However I can tell you that your ground_geometry variable is not a THREE.Geometry instance but rather a THREE.Object3D instance. The geometry you want is probably accessible at ground_geometry.children[0].geometry