2012-09-27 38 views
7

Đây là đối tượng đồ họa đầu tiên của tôi tại uni và một số phần của quá trình triển khai không hoạt động đối với tôi. Tôi có thể lấy các khớp để vẽ đúng cách, nhưng tôi đang cố gắng viết một hàm đặt trong 'xương' giữa các khớp. Tại thời điểm này, xương chỉ là hình khối được biến đổi thành lăng kính hình chữ nhật, sau này tôi sẽ cố gắng giới thiệu các mô hình thích hợp từ máy xay sinh tố hoặc thứ gì đó.Tạo bộ xương 3D đầy đủ với Kinect SDK

Sự cố của tôi là do xoay vòng. Sau khoảng 5 tiếng đồng hồ, bạn đời của tôi và tôi có thể làm việc đó, nhưng ngay khi bạn di chuyển cánh tay hoặc chân ra khỏi hình khối và trông kỳ lạ. Bất kỳ trợ giúp sẽ được đánh giá cao. Dưới đây là chức năng cố gắng vẽ xương.

private void DrawBone(Skeleton skeleton, JointType jointType0, JointType jointType1) 
{ 
    Joint joint0 = skeleton.Joints[jointType0]; 
    Joint joint1 = skeleton.Joints[jointType1]; 

    // If we can't find either of these joints, exit 
    if (joint0.TrackingState == JointTrackingState.NotTracked || 
     joint1.TrackingState == JointTrackingState.NotTracked) 
    { 
     return; 
    } 

    // Don't draw if both points are inferred 
    if (joint0.TrackingState == JointTrackingState.Inferred && 
     joint1.TrackingState == JointTrackingState.Inferred) 
    { 
     return; 
    } 

    // We assume all drawn bones are inferred unless BOTH joints are tracked 
    if (joint0.TrackingState == JointTrackingState.Tracked && joint1.TrackingState == JointTrackingState.Tracked) 

     //jointvector(joint) takes a joint and returns a Vector2 with its position data, with the z invtred to work properly with directx11 
     Vector3 bonevector = Vector3.Subtract(jointVector(joint0), jointVector(joint1)); 
     //cubevector is supposed to describe the initial vector of a cube centred at (0,0,0) with a side length of 2. A fair amount of guesswork has gone into this bit. 
     Vector3 cubevector = new Vector3(0, 2, 0); 
     //midpoint of two joints 
     Vector3 transTest = Vector3.Divide(Vector3.Add(jointVector(joint0),jointVector(joint1)), 2); 
     //divide by two because our original cube has side length 2 
     float scaleFactor = Math.Abs(bonevector.Length()/cubevector.Length()); 

     //we haven't been taught quaternions in class or anything, but after a fair while searching for similar problems they seemed like the go-to option for rotations. 
     world = Matrix.Transformation(new Vector3(0, 0, 0), new Quaternion(0), new Vector3(0.05f, scaleFactor, 0.05f), new Vector3(0, 0, 0), new Quaternion(Vector3.Cross(cubevector, bonevector), (float)Math.Acos(Vector3.Dot(bonevector, cubevector))), transTest);  

     //view and proj are defined elsewhere and are working fine, it's just the world that is being lame   
     worldViewProj = world * view * proj; 
     worldViewProj.Transpose(); 
     sDXdata.context.UpdateSubresource(ref worldViewProj, sDXdata.constantBuffer); 
     //36 vertices of the cube (two triangles per face) defined elsewhere 
     sDXdata.context.Draw(36, 0); 
     return; 
+0

Xin chào Vince, bạn có bao giờ thực hiện việc này không? Sẽ quan tâm đến việc hiểu cách bạn hiển thị mô hình bằng 3D. –

Trả lời

3

Đối với định hướng xương, kiểm tra:

skeleton.BoneOrientations[joint.JointType] 

nó sẽ cung cấp cho bạn một lớp BoneOrientation

http://msdn.microsoft.com/en-us/library/microsoft.kinect.boneorientation.aspx

Từ đó bạn có thể có vòng xoay là một trong hai toán qua tec non/Matrix, hoặc trong không gian thế giới, hoặc trong không gian xương của cha mẹ (cho da)

Ngoài ra bạn sử dụng:

new Quaternion(0) 

Đây là một vector 0, không phải là một quaternion giá trị luân chuyển, sử dụng:

Quaternion.Identity; 

mà sẽ là (0,0,0,1)

1

Mặc dù điều này đã được hỏi một thời gian trước đây, cho những gì nó là giá trị tôi nghĩ rằng đó cũng là một lỗi khi bạn tính góc của bạn. Bạn có:

(float)Math.Acos(Vector3.Dot(bonevector, cubevector) 

tôi nghĩ rằng bạn cần:

(float)Math.Acos(Vector3.Dot(bonevector, cubevector)/(bonevector.Length() * 
cubevector.Length())) 

Here là một ví dụ nhỏ đẹp của toán học. Bạn cũng có thể làm cho họ vectơ đơn vị, vì vậy họ có một chiều dài của một và không bận tâm với việc phân chia:

(float)Math.Acos(Vector3.Dot(bonevector.Normalize(), cubevector.Normalize())) 

Kiểm tra các trang MSDN để biết thêm thông tin.

Các vấn đề liên quan