◖◗
OPOSSUM
CULTURAL HERITAGE 3D LIDAR
SCANS: 00000
POINTS: 00000
CLICK TO SCAN


Insights from the Field:

Explore the Technology, Innovation, and Expertise Behind Our Transformative Projects


5GNaCAR:

5GNaCAR: Network-as-Code

5GNaCAR: Transforming Network Applications with Network-as-Code Capabilities Introduction to 5GNaCAR The 5GNaCAR project, an ambitious…

Read More
Supporting Subheading

Our Services

These are our services at Opossum Studios Virtual Builders. Tailored to preserve and innovate heritage, we utilize advanced technology to bring history to life. Explore our offerings to find the perfect solution for your needs.

Lidar Scanning

Utilizing Light Detection and Ranging (Lidar) technology, we provide precise and comprehensive 3D mapping of heritage sites and objects. Ideal for complex environments, our Lidar scanning service captures every detail with accuracy and efficiency.

Virtual Reality

Step into history with our Virtual Reality service. We create immersive and interactive experiences that allow users to explore and engage with heritage sites and objects in a way never before possible. Discover history through a new dimension.

Photogrammetry

Our photogrammetry service transforms standard photographs into stunning 3D models. By applying advanced algorithms, we recreate the texture, shape, and appearance of objects, preserving the authenticity of your heritage elements.

Consultancy

Benefit from our years of expertise in digital heritage preservation. We offer consultancy services to guide you through the process of selecting the best technologies and strategies for your unique project. Our insights ensure success in your digitalization journey.

Our Amazing Clients:

Meet the team

The talent driving our success

class Opossum:
    def __init__(self):
        self.CEO = "José Gabriel Ruiz Gonzálvez"
        self.universityDoctor = "Leticia Crespillo Marí"

    def who_we_are(self):
        introduction = "Well, folks... meet the crew!"
        CEO_description = f"Here at Opossum, where the past blossoms into a digital feast, you'll find {self.CEO}, our CEO and maestro. With the grace of a ballroom dancer and the precision of a metronome, {self.CEO} spins heritage into a digital crescendo."
        doctor_description = f"And let's not forget about {self.universityDoctor}, the university doctor whose smarts we can't deny. She's a global whiz kid, and although she operates in a knowledge stratosphere so high, we sometimes wonder if she's actually an AI!"
        conclusion = "But fear not! This dynamic duo of brilliance and banter will make your heritage quest the absolute best. While José Gabriel cracks jokes and makes the occasional wacky request, it's Leticia's intellectual prowess that truly passes the test. Welcome to our digital playground, where the past and future are profoundly and inseparably bound."
        return f"{introduction}\n\n{CEO_description}\n\n{doctor_description}\n\n{conclusion}"

def init (mail)
    mail = info@opossum.es

# Example usage:
opossum = Opossum()
print(opossum.who_we_are())
print(mail)
jose gabriel ruiz gonzalvez
J. Gabriel Ruiz Gonzálvez

Owner

Leticia Crespillo Marí
Leticia Crespillo Marí

PhD

// Opossum Follower Script document.addEventListener('DOMContentLoaded', function() { // Create the opossum character const opossum = document.createElement('div'); opossum.id = 'following-opossum'; // More detailed character (SVG for better quality) opossum.innerHTML = ` `; // Set styles for the character opossum.style.position = 'fixed'; opossum.style.zIndex = '9999'; opossum.style.width = '40px'; opossum.style.height = '40px'; opossum.style.pointerEvents = 'none'; // So it doesn't interfere with clicking opossum.style.transition = 'transform 0.2s ease'; // Add to the page document.body.appendChild(opossum); // Variables for tracking movement let mouseX = 0, mouseY = 0; let opossumX = window.innerWidth / 2; let opossumY = window.innerHeight / 2; // Character states let isScanning = false; let scanTarget = null; let isIdle = true; let idleTimer = null; let lastMouseX = 0; let lastMouseY = 0; // Track mouse movement document.addEventListener('mousemove', function(e) { mouseX = e.clientX; mouseY = e.clientY; // Reset idle timer when mouse moves isIdle = false; clearTimeout(idleTimer); idleTimer = setTimeout(() => { isIdle = true; }, 3000); // Determine if moving left or right const movingRight = mouseX > lastMouseX; // Flip the opossum based on movement direction if (Math.abs(mouseX - lastMouseX) > 5) { // Only flip if significant movement opossum.style.transform = movingRight ? 'scaleX(1)' : 'scaleX(-1)'; } lastMouseX = mouseX; lastMouseY = mouseY; }); // Handle clicks - add a small animation document.addEventListener('click', function(e) { // Scan animation isScanning = true; scanTarget = { x: e.clientX, y: e.clientY }; // Reset scanning after a delay setTimeout(() => { isScanning = false; scanTarget = null; }, 500); // Create a visual "ray" effect for the scan const ray = document.createElement('div'); ray.style.position = 'fixed'; ray.style.backgroundColor = '#000000'; ray.style.height = '1px'; ray.style.transformOrigin = '0 0'; ray.style.zIndex = '9998'; ray.style.opacity = '0.7'; ray.style.pointerEvents = 'none'; document.body.appendChild(ray); // Calculate length and angle of ray const opossumCenterX = opossumX + 20; // half of opossum width const opossumCenterY = opossumY + 20; // half of opossum height const length = Math.sqrt(Math.pow(e.clientX - opossumCenterX, 2) + Math.pow(e.clientY - opossumCenterY, 2)); const angle = Math.atan2(e.clientY - opossumCenterY, e.clientX - opossumCenterX) * 180 / Math.PI; // Set ray properties ray.style.width = `${length}px`; ray.style.left = `${opossumCenterX}px`; ray.style.top = `${opossumCenterY}px`; ray.style.transform = `rotate(${angle}deg)`; // Animate ray ray.animate([ { opacity: 0.7 }, { opacity: 0 } ], { duration: 300, easing: 'ease-out' }); // Remove ray after animation setTimeout(() => ray.remove(), 300); }); // Idle animations function doIdleAnimation() { if (isIdle) { // Simple wiggle animation opossum.animate([ { transform: 'translateY(0px)' }, { transform: 'translateY(-5px)' }, { transform: 'translateY(0px)' } ], { duration: 1000, easing: 'ease-in-out' }); // Randomize next idle animation setTimeout(doIdleAnimation, Math.random() * 3000 + 2000); } else { // Check again in a second setTimeout(doIdleAnimation, 1000); } } // Start idle animation check setTimeout(doIdleAnimation, 3000); // Update position with a bit of delay for natural movement function updatePosition() { // If scanning, move more directly toward target if (isScanning && scanTarget) { opossumX += (scanTarget.x - opossumX - 20) * 0.3; opossumY += (scanTarget.y - opossumY - 20) * 0.3; } else { // Normal following behavior // Calculate distance to move (easing function) opossumX += (mouseX - opossumX - 30) * 0.1; // 30px offset so it follows behind cursor opossumY += (mouseY - opossumY - 30) * 0.1; } // Apply position opossum.style.left = opossumX + 'px'; opossum.style.top = opossumY + 'px'; requestAnimationFrame(updatePosition); } // Adjust for different screen sizes window.addEventListener('resize', function() { // Keep opossum in viewport when window resizes if (opossumX > window.innerWidth) { opossumX = window.innerWidth - 50; } if (opossumY > window.innerHeight) { opossumY = window.innerHeight - 50; } }); // Start the animation loop updatePosition(); // Add a style for the opossum to bounce when it appears opossum.animate([ { transform: 'scale(0)', opacity: 0 }, { transform: 'scale(1.2)', opacity: 1 }, { transform: 'scale(1)', opacity: 1 } ], { duration: 500, easing: 'ease-out' }); });