Пример #1
0
float Heightmap::getInterpolatedHeightAt(float x, float z) {
    if(0.0f <= x && x <= 1.0f && 0.0f <= z && z <= 1.0f) {
        int col1 = floor<int>(x * (float)(columns + 1));
        int col2 = col1 + 1;
        float dx = x * (float)(columns + 1) - (float)col1;
        int row1 = floor<int>(z * (float)(rows + 1));
        int row2 = row1 + 1;
        float dz = z * (float)(rows + 1) - (float)row1;
        float x1 = x - dx;
        float x2 = x1 + 1.0f;
        float z1 = z - dz;
        float z2 = z1 + 1.0f;
        float height = 0.0f;
        if(dx + dz < 1) {
            triangle_intersection(vec3(x1, getHeightAt(col1, row1), z1), vec3(x1, getHeightAt(col1, row2), z2), vec3(x2, getHeightAt(col2, row1), z1), vec3(x, 0, z), vec3(0, 1, 0), &height);
        } else {
            triangle_intersection(vec3(x2, getHeightAt(col2, row1), z1), vec3(x1, getHeightAt(col1, row2), z2), vec3(x2, getHeightAt(col2, row2), z2), vec3(x, 0, z), vec3(0, 1, 0), &height);
        }
        return height;
    }
    return 0.0f;
}
Пример #2
0
bool
Polygon::intersection(const Ray *ray,
		IntersectionHelper *intersections)
{

	for (int i = 1; i < m_verts.size()-1; ++i)
	{
		double beta, gamma;
		if (triangle_intersection(ray, m_verts[0], m_verts[i], m_verts[i+1],
					beta, gamma))
		{
			if (!intersections)
				return true;

			IntersectionData d;
			d.u_tangent = m_verts[i+1] - m_verts[0];

			Point2D uv0 = m_uvs[0];
			Point2D uv1 = m_uvs[i];
			Point2D uv2 = m_uvs[i+1];
			d.uv[0] = (1-beta-gamma)*uv0[0] + beta*uv1[0] + gamma*uv2[0];
			d.uv[1] = (1-beta-gamma)*uv0[1] + beta*uv1[1] + gamma*uv2[1];

			Vector3D norm0, norm1, norm2;
			if (m_normals.size() > 0)
				norm0 = m_normals[0];
			else
				norm0 = m_normal;
			if (m_normals.size() > i)
				norm1 = m_normals[i];
			else
				norm1 = m_normal;
			if (m_normals.size() > i+1)
				norm2 = m_normals[i+1];
			else
				norm2 = m_normal;
			d.normal = (1-beta-gamma)*norm0 + beta*norm1 + gamma*norm2;

			d.t = (m_verts[0]-ray->get_pos()).dot(m_normal) /
				(m_normal.dot(ray->get_dir()));

			intersections->on_intersection(d);
			return true;
		}
	}
	return false;
}
Пример #3
0
std::shared_ptr<EETriangle> EditorScene::findTriangle(cocos2d::Vec2 rawpos)
{
    float tmpOut;
    auto ori = help_touchPoint2editPosition(rawpos);
    ori = help_editPosition2relativePosition(ori);
    for (auto tri : _triangles[_frameIndex]) {

        if (triangle_intersection(tri->a->pos3d(),  // Triangle vertices
                                  tri->b->pos3d(),
                                  tri->c->pos3d(),
                                  Vec3{ori.x, ori.y, 5.0},  //Ray origin
                                  Vec3{0.f,0.f,-1.f},  //Ray direction
                                  &tmpOut)) {
            return tri;
            
        }
    }
    return nullptr;
}