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; }
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; }
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; }