Hello everyone, I am Dr. Asha Thalange and today we are here to learn Huffman coding technique. At the end of this session, students will be able to learn how to encode the messages of the transmitter using Huffman coding technique. These are the contents we will be covering. Huffman coding technique is another type of source coding method which is used for data compression applications. It generates variable length code and gives the lowest possible value of average length of code that is L bar for a given value of m that is the number of symbols used for coding. It also provides maximum efficiency as it has lower L bar and minimum redundancy. It is known as minimum redundancy code or optimum code. Now let us see the steps used for Huffman coding method. First step, arrange the given messages in the decreasing order of probabilities. Group the least probable m messages and assign them the symbols used for coding. Add the probabilities of the grouped messages and place them as high as possible and rearrange them in the decreasing order again. This process is known as reduction. Next step, repeat the steps 2 and 3 till only m or less than m probabilities remain in the final reduction. Obtain the code words for each message by tracing the probabilities from left to right in the direction of arrow till the end and writing the respective symbols 0 or 1 above the path by tracing them from right to left. Now let us consider one example to see the Huffman coding process. The problem statement is in a communication system the source transmits 5 different messages say x1 to x5 with the probabilities 0.3, 0.15, 0.25, 0.05 and 0.25 respectively. If the number of symbols used to code these messages is 2 then find the code word for each message and the coding efficiency by applying the Huffman coding. Now from this statement the given is the set of messages x1 to x5 and the probabilities and m is equal to 2 here. Now let us solve this step by step. The first step arrange the given messages in the decreasing order. These are the given messages and their probabilities and after arranging we get this. So here x1 to x5 are arranged in the decreasing order of probabilities. The second step is group the least probable m messages and assign the symbols used for coding. Now in this case m is equal to 2. So let us use the symbols 0 and 1. Also we need to group the least two messages having the lower probabilities. So 0.15 and 0.05 are the two probabilities which are lower compared to others. So these two are grouped and the symbols 0 and 1 is assigned to this as shown. Now the third step is add the probabilities of the grouped messages and place them as high as possible and rearrange them in the decreasing order again. So this process is known as reduction. Now the sum of the probabilities of these two is 0.2. Thus compared to all others it is having a lower value. So it is placed at the lower position. So these are the probabilities which are obtained after first reduction where the 0.2 is placed at the lower position. Now the next step is to repeat the steps 2 and 3 till only two probabilities remain as m is equal to 2 here. So we again group the least two probabilities assign the values. Now the sum of these two is 0.45 which is greater than the higher probability 0.3. Thus it is placed at the top position and the remaining probabilities are now shifted. So this is the values that we are getting after second reduction. Now if you see again the number of probabilities in this reduction is still greater than 2. So we have to keep on repeating this step till we get two probabilities in the reduction. So we again group the lower two probabilities assign the symbols. Now the sum of these two probabilities is 0.55 which is greater than 0.45. Thus 0.55 is again placed at the top position and 0.45 is now shifted. Thus we see that now in this reduction after this reduction only two probabilities remain. Now we stop the reduction. Finally we assign the symbols to these two probabilities. Now once the reduction is over the next step is to find the code words for each messages. So obtain the code words for each message by tracing the probabilities from left to right in the direction of the arrow till the end and writing the respective symbols 0 or 1 above the path by tracing them from right to left. Now let us find the code word for the message X1. So we will be tracing the probabilities from left to right. So this is how we are tracing now the arrow is pointing to the lower side. So change the path as per the direction of the arrow. Now again further the arrow from the group is again pointing to 0.55. So again we change the direction to follow the direction of the arrow. So this is how the final path is obtained. Now once the path is obtained you have to find the code word by tracing the path from right to left. So we have to trace the symbols on this path. So these are the symbols. So from right to left the first symbol is 0, second symbol is 0. No more symbols further thus the code word for X1 is 0 and 0. Let us now find the code word for X3. Similarly following the probabilities and following the direction of the arrow this is how the path moves. Again tracing the values or tracing the symbols on the path we get first 0, 1 and no more symbols further thus the symbol or the code word for X3 is 0, 1. Similarly we will get the code words for message X5. So this is the path no more symbols further so code word for X5 is 1, 0. Similarly code word for X2 is obtained by tracing the path so symbols 1, 1, 0. So code word for X2 is 1, 1, 0. Similarly for X4 the path is as shown so once the path is there the code word is obtained by tracing the symbols 1, 1 and 1 thus X4 code word is 1, 1. Thus now for all the messages we have got the code and the length of code is as shown. Now let us find the average length of the code word for each message by using this formula of L bar. Expanding the equation and substituting the values we get L bar to be 2.2 letters per message. Further entropy is calculated by using the formula. Expanding the equation substituting the values its value comes to be 2.15 bits per message. Now pause this video and recall what is the relationship between the average length of the code word and the efficiency of the system. Yes they are inversely proportional to each other that is less is the average length of the code more is the efficiency. So let us calculate the efficiency by using the formula so substituting the values we get efficiency to be 97.7 percent. Thus we see how Huffman coding method is used to find out the code word and the efficiency of the system. Also Huffman coding method is more efficient than Shannon Fano coding method. If you consider a system and find the efficiency of a system by using Huffman coding definitely it is more compared to the efficiency obtained by using Shannon Fano coding method for the same value of m. This is the reference used thank you.


Hey there, and welcome to Learn WordPress. In this tutorial, we're going to learn about interacting with the WordPress REST API using the Backbone.js client that ships with WordPress. This video will cover the REST API schema, and then you'll learn how to create, update, and delete WordPress data. If this is your first time working with the WordPress REST API, I recommend watching the Using the WordPress REST API tutorial. This will introduce you to using the WordPress REST API with code examples. Alternatively, download the example code from that tutorial using this URL and use this to follow this tutorial. When working with the WordPress REST API, it's useful to keep the endpoint reference section of the WordPress REST API documentation handy. The endpoint reference lists all the endpoints that ship with WordPress call. Looking on an individual endpoint, say posts, I'll show you the schema for that endpoint. The schema defines all the fields that exist for a resource when fetching or creating data of that specific type. You will notice that many of the endpoint fields match up with fields that are available in the WordPress database related to that data type. Some, however, are slightly different. For example, the title field for the post endpoint will match up to the post underscore title field in the post table. It is important to remember that these differences exist and then to use the correct field name when interacting with the API. For example, when fetching the post via the API using the built-in backbone JS client, you would filter by the title field and not post title. Similarly, when looping through a list of posts returned from the WordPress REST API, you would use the post.title.rended property as the title field on the post is an object and the rendered property of that object is the actual content of the post's title. Let's use the WordPress REST API to create a new post. To do so, we'll need to pass the title and content fields to a new post model. You already have a plugin that allows you to list posts in an admin page, so you can use that as your starting point. First, you will need to update the page with a form that will allow you to enter the title and content of the post you want to create. You can do so using the following HTML. So under the main div, we'll add a new div and close it out. Then we will add a header and we can add a form element and inside the form, we'll add another container. Then we'll start with a label and give it a full property. So this is post title, close the label. And then let's add an input field type of text. And let's give it an ID and we'll call this WPlearnPostType. Then we'll copy this ID in the full attribute for the label and then we can close the div. And then let's copy this to create another form input. This time we'll change it from post type to post content. And then instead of an input, let's use a text area to find the ID as WPlearnPostContent. We've got some columns, so it takes up a decent amount of space, as well as rows, and then a text area needs a closing tag. And then finally, we can copy the first input to create the button to submit this. And we'll say the input type is a button. It doesn't need a label. The ID can be submitPost. And we'll give it a value of that. Here's what the form looks like when it's rendered on the admin page. With the form added, the next step would be to add the JavaScript that will handle things when the button is clicked. So first, we need to define a variable for the button. So we can say const submitPostButton. We document getElementById. And we can copy the ID from the form in the label. And then we can do a check. And here we can just say if submitPostButton. This is the same as doing the type of and undefined check that I'm doing here. If the button exists, then we're going to add the event listener to the button. Going to add the click event listener. And then we will do something once the button is clicked. Now that you have the button click event listener added, you can add the code that will handle the creation of the post. To do this, it's a good idea to create a separate function to create the post and call that function on the click event. So the first thing you'll need to do is create a function called submitPost. So just above this, we can say function submitPost. And then update the click event listener to call that function. So we can change this to submitPost. This will call the submitPost function when the submitPost button is clicked. Inside the submitPost function, you'll need to get the title and content values from the form fields. So we can do something like const, post title, document, getElementById, and then get the title field ID attribute. And we want to get the value of that input. And then we can do the same for the post content, appeal and post content, get the value. Next, you'll need to create a new post model object using the Backbone.js post model. You will then need to pass the values for the title and content to the model object. So the way we do that is we go post new WP.API models, post, and then we pass in an object. And according to the documentation, the fields are title and content. So we can say title is the post title variable and content is the post content variable. So that will be the contents of the fields. Finally, you'll need to send the request to the post route to save the data using the post model or save method. You could also add a done callback to handle the response once the post is saved to show some kind of message. So what we can do here is we can set post, save, done. And then we can specify function to trigger once the response is returned. The response will be a post if it's returned successfully. Do something with that post. Or we could just do something like say, post has been saved. If you refresh the admin page and enter a title and content, then click the Add button. You should see an alert that says post served. So let's try that. New post, new post content. And let's click and we see post served. If you use the plug-in example from the previous tutorial, you might now want to click the Load Post button to load the posts. Notice, however, that the post you just created doesn't appear. This is because the default value for the status field in the post model is dropped. So let's find the status field. And the options we have are publish, future, draft, pending, and private, so probably defaults to draft. You can change this by adding the status fields to the post model object and passing in the publish status. So here you can say status, pass in publish. Create the new post, hit the Load Post button, and you should see the new post in the list. Let's try that. So let's refresh and say another new post, content, hit Add. Post has been saved. Let's load the posts. And there is another new post. While we're here, let's check the post list. And we'll see there's the new post that was created in draft. And there's another new post. You can also update posts in the same way as creating them. The main difference is that you need to pass the post ID to the post model so that it knows which post to update. First, in the PHP file for the plugin, you'll need to add a new form to manage handling updates. For this, you can simply copy the code that's used to create posts, but update the relevant form field ID and add a field for the post ID and finally change the button text to update. So let's take this entire Add Post section and we will just copy and paste it below. And let's start doing that. So we'll say update post. We'll leave the post title, but we'll make the IDWP learn update post. Post content will stay the same, but we'll change the four attributes and the ID attribute to WP learn update post. We'll change the button to WP learn update post. Change the value to update. And finally, we'll create a new form field just above the title for the ID. So the label will be WP learn update post ID, post ID, and WP learn update post ID. That's all that's needed on the PHP side so you can switch over to the JavaScript file. The next step is to add a function to handle the post update. This will be very similar to the current submit post function, but we'll need to be updated with the various element IDs and pass the post ID to the post model. You can also leave out the status in this example. So let's take submit post and pop down the bottom here and let's call this update post. And it'll be WP learn update post title and WP learn update post content and then we will need a field for the ID. So we can copy post title and create a new one called post ID and get the correct ID attributes. And then in the object that's passed to the post model we need to specify the ID and we can remove the status because we're not going to update that now and let's just change the message to post updated and there's the function to handle the post. Finally, you need to add the click event handler for the update button and call the update post function when it's clicked. So let's take the submit post one and change it. So update post, update post button document get element by ID, WP learn update post. If update post button add event listener and let's call the update post function. The last thing you'll need to do is update the load post functionality to include the ID in the list when you load posts. So right at the top here, we will add in the all posts pitch we will add the ID to the list of fields to be pitched and then we will include the post ID to the output in the text area and we will just separate it with a comma. Go ahead and test this out in your browser. Refresh the admin page and load the posts. Then enter an ID updated post title and content in the update form and click update. So let's take ID 175 and we'll say updated post and updated post content and let's click update and the post has been updated. Once the post has been updated, reload the list of posts to confirm the content has been updated. Very clear it and load 175 has been updated. You can also check the post in the WordPress admin to confirm the changes. So if we refresh the post list, there is the updated post and there is the updated post content. Notice how in the block editor, the post content is displayed in a classic block. This is because in this simple example, you're not passing block markup to the post model. You can pass block markup to the post model, for example, by wrapping the content in a WP paragraph block tag, but this is beyond the scope of this tutorial. Just to show you what this would look like, let's create a new block post and pass in some valid block markup using WP paragraph tags, say new post content and if we add that, the post is saved and if we look at the newest post, the content renders as a paragraph block. Now that you know how to create an updated post, let's take a look at how to delete a post. First, you'll need to add another form to the admin page that will allow you to enter the ID of the post you want to delete, as well as a button to trigger the delete. So in the PHP, we can just grab update and use it for the delete and we just need the ID so we don't need the title and content. We'll say, don't we learn post ID, don't we learn post ID? And then we'll say delete post and delete, delete. Then as before, set up the click event listener for the button as well as the function to handle the deletion. So again, here we can just grab, for example, the update post, use the post ID and say, delete post and it was the WP learn post ID field and do the same, creating a button variable. So delete post button, WP learn, delete post, add a click event and call delete post. Now that you have the button click event listener added, you can add the code that will handle the deletion. The first thing you'll need to do is get the value from the form field, which we have already, then you'll need to create the new post model object and pass in the post ID. So it will be const post, new WP API models post and passing the object and let's do ID and then post ID. Finally, you'll need to delete the post from the database using the post models destroy method. As before, you can also add the done call back to handle the response once the post is deleted. So post destroy, then go back to handle the response once the post has been deleted and we'll just unload a message to say post delete it. Now refresh the page and load the posts, grab a post ID, pop that into the delete form and hit delete. System says the post has deleted, so let's load the posts and make sure that 178 is no longer there. 178 has been deleted. Let's verify this by looking at all the posts and if we look in trash, there is the new block post which is ID 178. More information in using and interacting with the WordPress REST API as well as how to extend it. Check out the WordPress REST API Handbook at developer.wordpress.org. Happy coding.


Welcome to another software review where I show you programs that you may not know exist that are just fun and Today we're going to be looking at Oniko. So you can install it. It should be in your Positories if you don't already have it installed. So check out your package manager or software manager or if you're using a Debian base system you can do sudo apt-get install Oniko is the name of the program. I hope I'm pronouncing that right. There's probably gonna be a lot of things I mispronounce in this video now I already have installed but you would hit enter type in your password and it would install it for you at this point You can type in Oniko and it will start up the application as you can see There's a cat now that is going to follow my mouse and when it gets to my mouse my mouse actually turns into I believe a little mouse So or my cursor turns into a little mouse I should say so that's the default setting, but it actually has a few other options in here So again Oniko you can also throw it in the background if you want with an ampersand at the end So that way you continue typing in your shell and you can actually run another instance of it So I can do that now. I have two cats chasing my cursor and So the next command will be the same but we're going to add the switch of Torah Which will add the same cap with the lines as if he's a tiger. I'm going to assume that's what the Torah means Next we can run the same command, but with dog and now I have the three cats and a dog chasing my cursor Next we can use the dash Sakura I'm assuming is how you say that which adds a little girl who appears to be dressed as a cat is now chasing my cursor as well and Finally, we also have to more to my To more to more Which is just a another girl that chases the cursor So now you have cats and dogs and people chasing your cursor, but we're not done there. There are other options so for example We can do The same command that we did with that girl there and we can add in foreground and background color So dash FG for foreground and we can make her red So now her foreground colors red or we can do blue and now we have another one where she's blue and we can also do Background color and set foreground colors. So now we have a girl here who's foreground color is black and her background colors blue and We can do the reverse of that we're going to green So now I have a green girl running around and you can combine those with So BG for background FG foreground. We do green and red So now we have that combination going so now you have all these running like this and let's say you want to stop them Obviously, if you're familiar with with using the ever sand throw programs in the background We have their process numbers here so I can kill the first one with kill and the process number or process ID I can also do FG and press enter and that brings the last one I ran to the foreground and then I can control C to kill it and I can do that one at a time or I can just say kill all Oniko and that will kill all of them. So that's it little program. You may or may not know have existed I hope you've enjoyed this video. It could be fun having these things running around on your screen as always I hope that you enjoy it Be sure to check out my patreon page patreon.com forward slash metal x1000 if you want to become a supporter of mine You can't support me financially. You can like subscribe share and comment those things help promote my videos And that helps me out a lot. I thank you for watching and as always I hope that you have a great day


Moving into three dimensions, first we must be clear about some conventions. In a 2D coordinate system, there's only really one way to position the two perpendicular axes. Sure, you could rotate and flip them around, but that would just be viewing the same thing from a different angle. In contrast, when we add a third axis, a z-axis perpendicular to the other two, there's an arbitrary choice of which way the third axis points. Here, the z-axis points away from us when we view x and y from the normal perspective, but here the z-axis points in the opposite direction. If you take some real world pointy objects, like pencils, and try to add a third perpendicular axis to two existing perpendicular axes, you'll find that you can't just rotate one configuration around to get the other. The difference is not just a matter of perspective. To be sure, it's an arbitrary choice which system we use, but we must choose one or the other. The two choices are known as a left-hand system and a right-hand system, so cold because if you form three perpendicular axes with your thumb as x, your index finger as y, and your middle finger as z, you get the different two coordinate systems with your left-hand and right-hands. So it helps to remember the hand gesture and which digit corresponds to which axis. In the previous video in perspective, we actually used a left-hand system where x pointed right on the screen, y pointed up, and z pointed inwards away from the viewer. It's actually most common in graphics to use right-handed systems, so that's the convention we'll mostly stick with here. Now, quite confusingly, in addition to left-hand and right-hand 3D coordinate systems, we also have a so-called left-hand rule and right-hand rule for expressing the conventions of direction of rotation. The rule involves a different hand gesture, where we imagine our grip is wrapped around an axis, and our thumb points in the positive direction along the axis, and we imagine the direction of rotations for a positive angle going in the direction of our curled fingers. So let's say we go by the convention of the right-hand rule and a right-hand coordinate system. Imagine then a right-hand 3D system in which the z-axis points towards you, and imagine gripping the z-axis with your right hand. Your fingers would then be wrapping counterclockwise around the z-axis. And as you can see, this corresponds to our usual convention in 2D rotations that a positive rotation in the xy plane goes counterclockwise. So it's not surprising that in a right-hand system, the right-hand rule is the dominant convention. Getting into transformations, translations in scaling in 3D really aren't any more complicated than in 2D. The vertices simply have one more coordinate value, so performing a translation is just a matter of doing one more addition. Rotations, though, are a different matter as things get considerably more complicated in three dimensions than in two dimensions. Let's start with the simple cases of rotating around one of the three axes. It shouldn't be hard to see that rotating around one of the axes in three dimensions is really just a 2D rotation in disguise, because it will mean only affecting two of the three coordinates of a point. For example, if I rotate a point around the y-axis, only the x and z values change. So we can, in fact, use the very same 2D rotations formula as long as we're mindful of plugging in the right coordinates in place of the x and y-over formula for two-dimensional rotations. So starting with the assumption of right-hand rule rotations in a right-handed coordinate system, we rotate around the z-axis by plugging x and y into our 2D rotation formula as normal. However, for the same right-hand conventions but rotating around the x-axis, we plug our 3D y-value in place of the usual 2D x and our 3D z-value in place of our usual 2D y. This is clear if you visualize the coordinate system from the perspective where x points toward us as z conventionally does, z points up as y conventionally does, and y points right as x conventionally does. By the same logic, rotations around the y-axis in the right-hand conventions are 3D z-value plugs in for 2D x and our 3D x-value plugs in for 2D y. Now, for a left-handed system with left-hand rule rotations, the rotations around the axes actually work out the same. Rotations around the z-axis use x for x and y for y. Rotations around the x-axis use x for x and z for y. And rotations around the y-axis use z for x and x for y. But what if we mix the left-hand rule conventions with a right-hand system or mix the right-hand rule convention with a left-hand system? Well, we could do one of two things. We could either swap the two coordinate values we plug into our formula, e.g. x becomes y and y becomes x, or we could simply negate the angle of rotation. Again, though, we'll stick to the dominant convention of right-hand rule rotations in our right-hand coordinate system. So again, to be clear for us, rotations around the z-axis will use x for x and y for y. Rotations around the x-axis will use y for x and z for y and rotations around the y-axis will use z for x and x for y. Probably the most aggravating thing about rotations is that just like rotations in 2D around different pivot points are not commutative, rotations in 3D around different axes are not commutative. This can actually be quite hard to visualize sometimes, as if you just pick up a random object and try rotating it around different axes in different orders, you can easily fool yourself with some edge cases where the results of different rotation orders seem to produce similar results. So it's actually probably clear to look at some numbers. So say that I have a 3D coordinate at 900, 500, 0, which I'll rotate 30 degrees around the x-axis, 20 degrees on the y-axis, and 70 degrees around the z-axis. For all six possible orders in which I can apply these three rotations, the point ends up in a totally different position. For example, when I rotate in the order x, then y, then z, the point ends up at negative 88.4, 1023.2, 72.9, but when I rotate in the order x, then z, then y, the point ends up at negative 6.7, 993.8, 268.8. The primary use of rotations in 3D rendering is to take your object models defined in a fixed orientation around their own local coordinate system, and we want to not only position these models in our world coordinates by translation, but also orient them in any direction by rotation. So here, for example, we have an airplane model, which is represented as a bunch of vertices fixed in space, such that the nose of the plane faces straight down the x-axis, and its tail points up parallel to the y-axis. The model just as well could have been built in any other orientation, but it usually makes most sense to build models with their front facing forward and their top facing up. Though, of course, which way in our coordinate system we decide faces forward and which way faces up, that's an arbitrary decision. In this case, we decided that the x-axis points forward and that the y-axis points up. It's also most common to build models with the apparent center at the origin, because this is usually the point we want our rotations to pivot around. The question now is how do we rotate the model to any desired orientation? As we'll informally demonstrate later, we can get a model from one orientation into any other in just three, or sometimes fewer, rotations around x, y, and z. Any order of x, y, and z will work, so z than x than y, or y than z than x, can do the same work as the order x than y than z. In fact, as we'll show later, we can even achieve any orientation using just two axes, as long as we rotate around one axis than the other than the first again. For instance, x, z, x works, but x, x, z does not. In any case, when we do use all three axes, the natural question is which order of x, y, and z is easiest to use? Well, first consider the three different ways in which we usually wish to rotate an object. Once again, this is easiest to visualize with an object like a plane in one direction and a right side up. When we rotate the plane around the length of its fuselage, we're controlling its roll. When we point the nose of a plane up and down, we are controlling its pitch. And when we point the nose left and right, we're controlling its yaw. Where this gets confusing is that we can make a distinction between extrinsic and intrinsic roll pitch and yaw. While an extrinsic rotation is a rotation around the fixed axes of our coordinate system, an intrinsic rotation is relative to the current orientation of the object. So, here for example, if we again have our plane starting out facing down the x-axis, but then we rotate it, the plane then implicitly has its own axes, x-prime, y-prime, and z-prime, which are relative to its new orientation. A rotation now around the original x, y, or z would be an extrinsic rotation, but a rotation around x-prime, y-prime, or z-prime would be intrinsic. And be clear that each time we rotate the plane, we implicitly produce a new set of intrinsic rotation axes. After second rotation, we'd call the third set of axes x-prime, y-prime, and z-prime. And then after a third rotation, we'd call the fourth set of axes x-prime, y-prime, and z-prime, and so forth. A convenient fact, though one we won't prove here, is that a series of extrinsic rotations produces the same result as the reverse order of intrinsic rotations. So, for example, if we extrinsically rotate around x than y than z, we end up with the same orientation as if we instead intrinsically rotate around z than y-prime than x-prime. This is good to know, as depending upon the situation, it may be easier to think in terms of intrinsic rotations than extrinsic rotations. And so converting from a series of intrinsic rotations to a series of extrinsic rotations allows us to use our formulas for rotations around the fixed axes. Back now to the question of what is the most natural way to describe an object's orientation and space. Well, if we imagine an airplane flying somewhere in the world, we of course would first describe its position at world space, its latitude and longitude. But then for its rotation, most people would start with its heading, aka its yaw, relative to the ground. Next, most people would describe its pitch relative to its heading, aka its intrinsic pitch rotation. Lastly, we describe the plane's roll relative to its heading and pitch, aka its intrinsic roll rotation. So back to our plane model, which is oriented such that x is its roll axis, y is its yaw axis, and z is its pitch axis. In this configuration then, the natural way to orient the plane is by intrinsic rotations around y, then z-prime, then x-double-prime. Do note that in a series of intrinsic rotations, the first axis is just a normal cardinal axis, like in an extrinsic rotation, assuming that the object we're rotating starts out aligned correctly on the cardinal axis, as is the case here. In any case, to express this here as a series of extrinsic rotations, we simply reverse the order so x, then z, then y. Be clear that this all depends on the original orientation of our model. If our plane model was instead built oriented with its nose facing up the z-axis, then z would be our roll axis and x our pitch axis, so the order of intrinsic rotations would be y, then x-prime, then z-double-prime, and the extrinsic rotations would be z, then x, then y. The simplest, most general way to remember it is as the extrinsic rotations in the order roll, then pitch, then yaw. This order is significantly easier to work with than other orders of rotations. If I tell you an object is rolled 30 degrees right, then pitched 45 degrees up, and then yawed 90 degrees left, you should be able to picture the result fairly easily. And if presented with an object in some orientation, you should be able to visually estimate its roll, pitch, and yaw in the same specific order. The same cannot be said of alternative extrinsic rotation orders. Presented with an object in some arbitrary orientation, it can be difficult to visually estimate how to produce that orientation by applying rotations in some other order, like say, yaw, then roll, then pitch. We already know how to rotate objects around the coordinate axes, but what if we wish to rotate around some other line that also runs through the origin? The trick for such cases is similar to what we did to rotate in two dimensions around the right point. We'll temporarily change our frame of reference to redefine the problem into one we already know how to solve. So what we'll do here first is apply rotations which will make the line overlap any one of the three coordinate axes. It doesn't matter which. As in when we rotate to make the line overlap the x-axis, we could then perform the rotation around the line by rotating around the x-axis, something we already know how to do. Having done that, we simply then undo the rotations that changed the frame of reference. The only question now is how exactly to rotate the line onto one of the axes? Let's say we choose to rotate the line to overlap the x-axis. We have a few options, actually. We could first rotate the line to the zx plane by rotating around the z-axis, or we could do the same by rotating around the x-axis, both work. Once the line is on the zx plane, we rotate the line onto the xy plane by rotating around the y-axis. In this process, the important thing to remember is that rotating around z or x may change the line's angle to the x-axis and the zx plane, so you should figure the second rotation angle only after the first rotation, not before. We have two more options for rotating the line. We can rotate to the xy plane first by rotating around either x or y, and then we would rotate to the zx plane by rotating around z. So note that we can rotate the line to overlap the x-axis in four possible combinations of two axis rotations, either z then y, or x then y, or x then z, or y then z. As you might imagine then, if we instead decided to rotate the line to the y-axis, we could do so with four more possible combinations of two axis rotations, and likewise if we decided to rotate the line to the z-axis, we could do so with four more possible combinations of two axis rotations. Just remember that for all of these options, the first rotation may change the angle of rotation needed for the second rotation, so we should perform the first rotation in the second rotation angle. In any case, whichever axis and rotations we choose, we can then rotate around that axis to rotate around the line. Having accomplished our rotation, we put our frame of reference back by simply applying the same rotations in reverse order. So say if we rotated the line to the x-axis by rotating 20 degrees around z and then 30 degrees around y, we would undo those rotations by rotating negative 30 degrees around y and then negative 20 degrees around z. Note that we reverse both the order of the rotations and their directions. Looking now at an actual example line running through the origin, how exactly do we rotate this line to lie on the x-axis? Well, first note that a rotation around the z-axis is a rotation in the x-y plane and the slope of a vector in that plane is y of v over x of v, v here standing for vector. Likewise, rotation around the x-axis is a rotation in the y-z plane and the slope of a vector in the y-z plane is at z over its y. And lastly, rotation around the y-axis is a rotation around the z-x plane and the slope of a vector in the z-x plane is its x over its z. Notated more formally, the slope of a line in the x-y plane we would call m of x-y and it equals y of v over x of v. Likewise, m of y-z equals z of v over y of v and m of z-x equals x of v over z of v. Once we have our slopes, we can then figure the angles of those slopes by getting their arc tangents. So theta of z, the angle of the vector in the x-y plane, is arc tangent of m of x-y. Likewise, theta of x, the angle of the vector in the y-z plane is arc tangent of m of y-z and theta of y, the angle of the vector in the z-x plane is arc tangent of m of z-x. So now that we can find the angle between the vector and the coordinate planes, we can rotate the vector to line up on an axis. Again, just remember that the first rotation changes the angle we apply in the second rotation. Here's the process in more detail. If we wish to rotate theta degrees around the line, and assuming we'll use the x-axis as our temporary frame of reference, then we rotate to that frame of reference first by finding theta of z, the angle of the line in the x-y plane, then rotating around z by negative theta of z, then finding theta of y, the new angle of the line in the z-x plane, then rotating around y by negative theta of y. Now we're in a frame of reference where the line overlaps the x-axis so we can rotate around the line by rotating around the x-axis. Then we have to shift the frame of reference back, applying the same rotations from steps one and two, but reversing their order and directions. So we first rotate around y by positive theta of y and then rotate around z by positive theta of z. Then be clear that these are the same theta of z and theta of y, which we found in steps one and two respectively. So that's how we can rotate around an arbitrary axis. Again, though, using the x-axis as our temporary frame of reference is an arbitrary choice. We just as well could have used the y or z-axes. I'll also recall that for whichever axis we choose, we actually have four possible pairs of rotations around the axes that will make the line overlap the chosen axis. This gives us a total of 12 possible combinations of rotations around x, y, and z that allows us to rotate around an arbitrary axis through the origin. Not coincidentally, these are the same 12 possible combinations which allows us to rotate an object from one orientation to any other. To see why this isn't a coincidence, imagine we have an object oriented on some arbitrary line through the origin, like this airplane here. We know we can rotate the line, and thus the airplane, to point down one of the axes, and rotate the x-axis, and then we can roll the airplane around the x-axis so that it faces right side up. So no matter which way the line originally points and no matter how the airplane starts rolled around that line, we can use three rotations to get the airplane facing down the x-axis with its right side up. In other words, we know we can get the airplane from any orientation into one particular orientation using the same 12 combinations of rotations around x, y, and z which we use to rotate objects around an arbitrary line through the origin. So if we can get from any orientation to one particular orientation and three rotations, then logically we can go the other way just by reversing the moves. We can get from one particular orientation to any other orientation in three rotations. What we've stumbled upon here is a bastardized informal version of Euler's rotation theorem. The logic goes like this. Given that we can rotate an object from a given orientation to any other orientation of three or fewer rotations around the cardinal axes, and given that we can rotate around any arbitrary axis with the same combinations of three or fewer rotations around the cardinal axes, therefore, we can rotate an object from a given orientation to any other orientation by rotating around some arbitrary axis. That is, we can get to any orientation in just one rotation. Moreover, multiple rotations around different axes which all intersect at the same point can be combined into one rotation. This last point will be quite significant when we revisit rotations using matrices. For completeness's sake, here are the 12 possible combinations of three rotations around X, Y, and Z that achieve any rotation around the origin. For reasons I won't get into, the combinations are all known as Euler angles after the 18th century mathematician, but a distinction is sometimes made between the proper or classic Euler angles and Tate-Brion angles. Notice that the proper Euler angles all start and end with a rotation around the same axis. Remember much earlier when I said that we surprisingly can achieve any rotation using just rotations around two of the three cardinal axes? Well, now you should understand how this is possible. For instance, the combination X, Y, X works because, as we discussed, a rotation around X and then around Y will get any line through the origin to overlap the X axis, and a subsequent rotation around X will then effectively rotate around the line. This means that, using the combination we can rotate an object from any orientation to one particular orientation, so logically we can do the reverse with X, Y, X, rotate from one particular orientation to any other orientation. Just be very clear that while any of these combinations of rotation orders can be used to achieve any orientation, different rotation orders produce different results for the same angles. For example, if I rotate 30 degrees around X, then 50 degrees around Y, and then 20 degrees around Z, I get a different orientation of the order, first rotating 20 degrees around Z, then 50 degrees around Y, then 30 degrees around X. The same angles in a different order equal a different result. Also recall that an order of X-transit rotations is equivalent to the reverse order of intrinsic rotations, so we actually have 12 more combinations of rotations, which are the reverse order of our first 12 within intrinsic rotations. Now that we can rotate around an arbitrary axis running through the origin, what about rotations around axes not running through the origin? Well, the solution is very simple and similar to the trick we used in 2D to rotate around pivots other than the origin. Once again, we temporarily change the frame of reference, this time translating the line so that it does pass through the origin before performing a rotation and then translating back. We first select any point on the line, it doesn't matter which, we then find the vector from that point to the origin, and this vector is a translation we perform to temporarily change our frame of reference. The problem with using Euler angles as a system of describing object orientations is that Euler angles are susceptible to a phenomenon called gimbal lock. A gimbal is a device of interlocking rings with the outer ring hinged to rotate on an axis, and each inner ring hinged to rotate around the diameter of the ring immediately surrounding it. With a gimbal of three rings, the inner ring can effectively rotate in any direction from any starting orientation, except in the special case of gimbal lock. Gimbal lock occurs when any two of the rings align, and it occurs that rotations of either aligned ring produce the same rotation on the inner ring. In a sense, a degree of freedom is lost, though as Wikipedia points out the term lock is perhaps misleading because all three rings are still free to rotate. Nothing is locked in place. So how do the problems with gimbals relate to our rotations? Well, notice that a gimbal of three rings is just like a system of intrinsic Euler rotations. The rings can start out perpendicular to each other just like three axes, and a rotation of the outer ring changes the orientation of the two inner rings, and a rotation of the middle ring changes the orientation of the innermost ring. So a gimbal is actually a physical manifestation of intrinsic Euler angles. It follows then that Euler angles share the same problems. Because of scenarios like gimbal lock where two intrinsic rotation axes align, some orientations can be described in Euler angles with multiple angle values, even within a single order of rotations. So for one example, in the extrinsic rotation order X, Y, Z, the X, Y, Z angles 45, negative 90, negative 45 produce the same result as the X, Y, Z angles 0, negative 90, 0. In fact, for any set of angles where the Y angle equals negative 90 in this extrinsic rotation order, the rotations around X and Z actually have a reverse effect around the same axis. A rotation of n degrees around X equals a rotation of negative n degrees around Z. So for this rotation order X, Y, Z, any two sets of angles where the Y angle equals negative 90 and where the sum of the X and Z angles are equivalent, the rotations produced will be the same. The problem with all this redundancy is that it introduces yet more arbitrary choices for us to make on top of the choice of which of the 12 rotation orders to use. The sum effect is that Euler angles burden the users with extraneous decisions not to mention potential confusion. Another troublesome aspect of Euler angles arises in animations. We can animate a rotation frame by frame and so describe any motion we want with Euler angles. Most commonly, though, computer animations are specified by an animator using keyframes such that the object positions for frames in between get interpolated automatically. So imagine an animation system that uses Euler angles and interpolates between keyframes by simply interpolating between the respective angles. If our first keyframe has an object rotated at X, Y, Z angles 0, 30, 50 and our second keyframe has the object rotated at X, Y, Z angles 170, 40 then for each frame interpolated between those positions the X angle will smoothly change from 0 to 100 and the Y angle from the 30 to 70 and the Z angle from 50 to 40. While the resulting animation would appear smooth, the nose of the object would appear to travel in a bent arc along the sphere of rotation. So Euler angles have a tendency to frustrate animators because they often produce unintuitive animations. The purpose for this is to have the animation system do a more sophisticated form of interpolation such that the rate of change between angles differs for each coordinate. The other fix is to use an alternative system of describing rotations called quaternions. Unfortunately quaternions are well beyond our scope here as they involve complex numbers in a way that goes beyond high school algebra. They were first described by a 19th century iris mathematician William Rowan Hamilton who famously in a moment of inspiration devised the key formula that equals j squared equals k squared equals ijk equals negative 1 while taking a walk and then immediately carved the formula into a stone of the bridge he stood on. While a bit tricky to grasp, quaternions don't suffer the same drawbacks as Euler angles and so are commonly used in 3D animation. I'd like to cover them in a later video but I'm not well qualified to do so as I barely understand them myself so I can't make any promises. Perhaps I'll later just direct you to other resources that cover quaternions well.


What's going on everyone? Sam here with late in sports cards. We're ripping mega dual case NBA. 21-22, Panini Contenders, Optic and one-in-one basketball hobby, three X tiered teams. Here's a look again at your random results. As always, you can find these on the website under the results tab as well as the link that is currently in chat. So good luck here everybody. Let's get a little weird with it here. We've gotten like 200 followers over the last two days. Monsters right now. We're going to start with Contenders, Optic and we'll end with one-in-one. Yeah, we've been unstoppable right now on Contenders, Optic. Hey, what's up Matt? One of the new 200. Let's go dude. Heck yeah dude. Welcome to the YouTube side. You got the face cam over here. You got the top cam. All the features and everything. You see what we can look like now. Sean and myself. We spared everybody from that one. All right, good luck guys. I appreciate that Matt. It's nice having you here man. Thanks for stopping by hanging out. Welcome in my man. I think Matt said he used to watch this on YouTube but good to have you in. Welcome to the show. Welcome to the party. Contenders, Optic and some community one-in-one man. I haven't done that in a minute. Ace, red, Jalen, Brunson, Rookie Auto, Cameron, Thomas. That's going to Brooklyn. Nice one there Brooklyn. Herbert Jones, Hoop Dreams, Bam on a Bio, Tyler Hero, Blue Ice, 64 out of 75. Everything's full actually right now man. Haha, appreciate you Matt. Appreciate you buddy. Yeah, it's always fun going over. First of all, shout out LF Sports Cards over on YouTube. That dude does an amazing job. You the man. Amazing job. We appreciate you. Really appreciate him man. He is, does God's work finding all those hits man. You the man bro. Guzma, Blue, James Harden. Man what a start dude. 38 out of 99. Are we already starting? We're already starting dude. This is going to Anthony C. Last spot Mojo Anthony C that is. How about a Cade Cunningham? That is four of 75. Boom let's go. What a way to start dude. What a way to start. That's our third Cade Auto of the day. Wow. Let's go man. Congrats Anthony. There you go Tick Tock. Gorgeous one there. Baseball, yes we do. We'll get that nagged up for you my man. Links in the bio. We normally start with baseball and then move to basketball and end it in football. Davion Mitchell and Robert Williams. Numbers game. That is a color. That's like a perfect Cunningham color match as well. Yeah we do, I mean we'll even do soccer, hockey, F1, Star Wars, WNBA. What else have we done recently? We got a full gaming side. Yeah full gaming side, late in gaming over on Twitch and over on Tick Tock as well. It's like I think we may have a gold Sean. I don't think it's it's not the gold auto. No, no, no, no, no it's not, no it's not. Orange is the 49. That's Kawhi Leonard. Base auto is Herbert Jones. You'll see why I thought it though. For the Pelicans. We've got Bones Highland, Nicola Jokic, not numbered. The pick and roll. You can see the gold on the bottom. And Steph Curry, Jonathan Caminga. Steph Curry, me Buncher. You just missed the vinyl. You really just say that out loud. There's going to be like. That's his name. I know. I'm excited to watch. I might watch that Star Wars break tomorrow actually. It's going to be fun man. Hey yo. Hey yo. 2G stream here Sean. Sorry, I guess I should have. Jalen Green rookie. Pre-Reddit maybe? Orange, Jalen Brown. Nice one there for the Cs to 49. Yes, Mack. It's Pokemon, Metazoo, Flesh and Blood, everything dude. Usman Garuba. That's numbered to 75 for the Rockets on the Red. I'd give it like a B plus A minus I would say. I'd love one more auto in the box for the price point. Kevin Durant playing the numbers game. And Red Ice, Moses Moody. But I mean it's, you know, it's what the market declares at this point. Sometimes brand new, just came out. It's a good class. We need a fronds man. We need a big magic. Hey, we haven't seen a frond or a suck. We haven't seen either the magic guys. Said I uh, I'll trade you this pack. Big fronds. Gold vinyl fronds. We know what happens. We know what happens. John and Kaminga, Red Rookie. Camargo de Rosen, Blue. Give me number two, uh, 99. Wade, 425 a box. You've got nice. Red, Io de Sudmu, number two, 99. 95 out of 99. Yep, we got White Shorts over there. Yes, we do. Frans Wagner playing the numbers game. And Red Ice, Legendary Tandems, Russ, and KD for the Thunder. Pulled a lot of Cades today actually. Pulled at least one Cade of Cades so far I think. Maybe we had one Cade without one, but the last break we pulled one, the break before we pulled the I know they're looking good man. I'm a Hawks fan. I don't love that. I love it. I do not. Zion on the 75th anniversary. Lamello Red. There's a Quinton Grimes Red. That's number two at 30 out of 75 for the Knicks. Well man, you should just drive over here. Yeah, Lee, make the drive down at some point, Lee up. Scottie Barnes playing the numbers game and Pick and Roll, Aten and Booker to 75. We got a beautiful storefront, man. Full of stuff. Oh yeah. Full. Rockets look really good, man. Rockets can be Jabari Smith starting to come into his own now. Jaylin. Yeah. What's going on with the shack in the background? Just kind of a fun little add-on. We also have a Pickle Rick over there too. We're in Orlando, man. Bone, Tyler. There's Donovan Mitchell on the 75th anniversary. Got Kai Jones on the Rookie Ticket Auto, not numbered for the Hornets. Lamello Ball. Pickle Rick out. And nice blue ice color match that is 69 out of 75. Yeah, Pickle Rick will make his appearance every now and then. I'll pull him out.  Hungover, honestly. Yeah, Jaylin, KPJ, Shengun, Jabari Smith. That's a good team, man. Yeah. The really solid squad. Zion. There's a Scottie Barnes, Rookie. Marcus, Mack is Smaat. Mack is Smaat. It's a 99 for the Celtics on the blue. Got a Poku for the Thunder to 75. Sweet shot. It's RJ Barrett. And Tim Duncan, Tony Parker for this first. Yeah, I wish Bob was here right now. I wish Bob was here right now.  American actually would have curbed stuff. Stone Cold Steve Austin. Yeah, put the stunner on you. There he is, Basely. KPJ. Nice color match on this Tatum. That's so nasty. That's going to be six of 25. Let's go. Congrats, Cs. Look how gorgeous that is, man. There we go, Boston. Thomas Jay on the tier two. That Tatum color match going to get that focus here. So tough at the Pulsars, man. I was going to say you called it there, Alex. Got Jay Val, Perennial contenders for the Pelicans to 99. Sweet shot. Trey, James Hardin, Red Ice, playing the numbers game. And Ice Bone Tyler would be pretty cool. Orin, no, Red Devon Booker, Jalen Brunson. There's a Jonathan Kominga base auto. Nice way to end it. Pulled a ton of him so far. That's going to the Warriors. Congrats, Golden State, Willem. Jalen Green, Boop Dreams. And RJ Barrett, 45 out of 75, going to the next. Yeah, shoot us your credit card number. And you can potentially have that key in the background. You've got to buy a group break spot or a personal box. All right, the second. Yeah, we do break seven days a week as well, guys, over on YouTube and Twitch. Yeah, I know, Marshall, right? Yeah, Jonathan Kominga not known for his signature, for sure. Yeah, it's a group break, so all these spots are already paid for. So yeah, that Cade is already technically a customer's. Mitchell, Evan Fornia, Yanis Silver. There it is. Scotty Barnes on the base auto. There we go, Raptors. Hill and T. Congrats, man. There's a Scotty Barnes. Nice one there, Tick Tock. Scotty Barnes. That'll go straight to a mag. Evan Mobley and Darius Garland, pick and roll. And a sweet shot. Trey Young to 75. Look at what he's got. I don't even care about the Scotty. I know it's on the back. Oh, I know. Just can't get away from it. Hope everybody is ready for a full case of one-in-one right after this as well. Same break, man. How are hero red? Rookie Otto Isaiah Jackson going to the Pacers. Nice one there. We've got Chris Duarte, Lottery Tickets, and sweet shots. Bradley Beale, the wizards. Never gonna get old, man. You got serious, serious problems. How are you red? How are you maxi? There's a Trey Murphy that's going to the Pelicans for $25 a box. Anthony Edwards, Superstar. And Uniformity John and Kaminga Blue Ice, $60 out of $75. This is already stuck in your head now. Why do you think I do it there? They control this guy, please. Yeah, some please. There's Basley. There's a Chris Stopps for Zingas. We've got Brandon Boston Jr. on the base auto. That's going to the Clippers. Nice one there. Nicolay Jokic, do you enjoy our suffering than the Vaughn? Yeah. And Blue Ice, Corey Kisbert for the Warriors, $70 out of $75. Vaughn, he does. Absolutely, man. Robert Williams, Scotty Barnes-Rookie, followed by a Bones Island. There he is. First one, first Bones Island we've seen, I think, today. Going to Denver, congrats, Nuggets. Jason Williams, Chris Weber, Legendary Tandems. And Evan Mobley, Blue Ice, $19 out of $75. Lottery Pickets. See a good color, I believe. Sabonis. There's Anthony Simons, $10 out of $25. Nice one there on the green pulsar for the Timberwolves. We've got eight of 10. Jalen Brunson, Gold, Forennial, Contenders. Going to the Mavericks. That's Dallas. That's Bobby. Brandon Boston Jr. and Red Ice, Aaron Wiggins. Deontay Murray. Rookie Corey Kispert. Nice one there, number 225. That's three of 25 on the green pulsar. Got Steven Jackson to $149 for the Warriors. That's Golden State, Willem. Iowa Desun, Mohoop Dreams. And Blue Ice, Scotty Barnes, $28 out of $75. A few more boxes to go here, everybody. Devon DeSalle. Rudy Gobert. We've got Jericho Sims. That is going to the Knicks on the base off. Pick and roll, LeBron and Anthony Davis. And Blue Ice, Trayman, $75. Five of $75, Thunder. Rippin' Fire is the other guy here. He works for Layton. Rippin' Fire works for Layton. He's right here. This is Rippin' Fire, next to us. Rippin' Fire is with Layton. He is promoting Layton. Herbert Jones Rookie. There's Orange James Hardin to $49. Nice one there for the Sixers. Nice one. First one we've seen today. Jalen Suggs on the up and coming. There you go, Tyler. Nice one there, man. He's going to be playing the numbers game Sixers. Ann Lawry to gets Joshua Primo. They've been extremely elusive, Vaughn. I agree with that. Luca Silver. Derek Rose, red up and coming. Jericho Sims. You're good. No worries, Zach. $58 out of $75. Nice one there for the Knicks. It's out for the season. No worries, Zach. Good stuff shutting that down, though. I appreciate that. Bones Island, Hoop Dreams. And Red Ice, Kevin Durant, and Kyrie Irving. Not that number. All right, let's do some one-on-one. Good luck, everybody. Full case of one-on-one. At least you don't have a top load or anything like this. No, they're just like, why are you promoting your channel? Which good stuff, like I said, good stuff. I'm like, things are looking out for that. Like that gets really annoying really quickly. But do it. We had to ban somebody for that today already. But no, I appreciate that. Thanks, Zach. Zach, hey, all right, Zach. All right, good luck here, guys. That's going to be scary that they're going to be at the top of the lottery. All right, first card. We've got Josh Hart. That's going to the Trailblazers, 7 of 30. Nice one there. It's going to be, I like the team. That is Cade Cunningham, 21 out of Holy Cow. Have a break, Anthony C. Last spot, Mojo, my friend. Nice, Cade. There we go. What a way to start this case of one-in-one, man. The prime SIGs. Beautiful SIG on that one as well. Let's go. Let's go. We can figure these really quick so we can get a good one down there. Oh, yeah. Oh, Scotty. Yeah, I'll take the Scotty one. Scotty Bonds. Box two.  Crazy downtown. All right, we've got Davion Mitchell. That's number 93 out of 99. Rookie for the Kings. And then we've got, don't think this is a rookie. It's going to be Mike Conley, 17 out of 35. Game used, going to the Jazz. Nice one there, Brett S. On the low tier hit. Congrats, man. Yeah, timeless, timeless moments are the other big one. Yep, yes, sir. Nice one here. Going to the Blazers. How about a Gold, Anthony Simons, four of 10?  He's so good. Congrats on that Portland. That's Tyler W. Let's see here. It's Alfred Shendun. Nice, 13 out of 49. Going to the Rockets. There you go, Houston. Nice one there, Space City, H-Town. That's also true. That's also a good point, Vaughn. Who's the number one option there? Yeah, that was it right there. That was a turd, Duncan. Right there, six. Came out at the perfect time, man. Got a James Book Knight rookie, 67 out of 99. Nice one there for the Hornets. Got a Redemption. Yes, we do. Prime rookie Jersey autographs, red. Car number 13, Scotty, boom. Boom, going to the Raptors. Hill and T. Congrats, man. Another Scotty. Nice one there. Nice one here. We've got a Gold Jared Allen for the Cavaliers. Grats on that Cleveland. Chris G, the 10. Seeing a rookie. We've got the Jalen Suggs. 86 out of 99. There we go, Tyler. Second Suggs to the break for you, man. Let's go. Nice one here. Going to Phoenix. That's going to be Chris Paul. 20 out of 30. That's 20 out of 30. We've got Miles McBride. That's going to the Knicks on the Rookie Jersey Auto. Prime 14 out of 99. Hats are very snug, Carl. Hat is very snug today. This is one I have to wear when I get my hair cut because it doesn't fit when my hair is longer. Hat is extremely snug today. Wow. Dude, that's so nasty. This is the first one I've seen of this. Who's got this team really quick? Will M. Put a sneaker spotlight. 91 out of 99. Yanis on tentacupo. The Greek freak. Boom. Awesome card, man. Let's go. That's so fire. Will M with a Tier 2 hit right there. So nasty. There you guys go over on TikTok and back to YouTube and Twitch. Awesome one there. That's not even the only card in this entire box either. We've also got Rick Berry. 89 out of 99 on the 70... What is that? 75th team anniversary signatures. Nice one there. He had a gorgeous card, man. Love that Yanis. I'll actually card stand that Yanis, I think. Absolutely. Why wouldn't we, man? Put it over there. Just going right. It's tough when we get like horizontal and vertical. There we go. Nice family picture right there. Cheese. Cheese. Got Jose Alvarado, rookie to 99 for the Pelicans. Congrats to New Orleans. New Orleans. New Orleans. New Orleans, Louisiana. That's going to be Corey Kispert. 59 out of 99. A rookie jersey auto going to the Wizards. Two boxes to go. Good luck, everybody. We've got Jordan Poole. That's going to be number 299. Who's that? Silverado. San 3, say the Ravens. I hate Vaughan, man. Get him, Vaughan. 75th team anniversary signatures. Ray Allen. 9 out of 35 going to the Thunder. Nice one there, Brett. That's Sonics going to the Thunder. Pull in there, man. An empty box. And the last box of the break. Good luck, everybody. See who can pull out of this. Greg Brown. That's going to the Blazers. Number 20 of 30. Rookie. Got a rookie jersey autograph of Herbert Jones. Nice one there. Congrats to Pelicans. Jesus show of thought. All right. Let's do a quick recap here. We've got, here we go. Jalen Suggs Magic. Jericho Sims-Nix. Jericho Sims-Nix. Steven Jackson Warriors. Jalen Brunson Mavs. Bowen Tyler Nuggets. Brandon Boston Clippers. Trey Murphy Pelicans. Isaiah Jackson's Pacers. John Linkomingo Warriors. Jonas Valenshunis Pelicans. Alexi Pogoshevsky Thunder. Kai Jones Hornets. Quentin Grimes-Nix. Io Desumu Bulls. Uzman Garuba Rockets. Herbert Jones for the Pelicans. Cam Thomas. That's going to the Nets. Got Scotty Barnes on the redemption auto. We had Herbert Jones Pelicans. Ray Allen Thunder. Corey Kispert Wizards. Rick Berry Warriors. That's Miles McBride for the Nix. Jalen Suggs Magic. Alfred Shengun Rockets. Mike Conley Jazz. And then we've got our big hit. We had a Scotty Barnes base auto. Going to the Raptors. Cade Cunningham. rookie jersey auto for the Pistons. Another Cade Cunningham. This time numbered to 75. Four of 75 at Pistons. And a Aeonis on Tentacupo on the sneaker spotlight. Going to the Bucks. That'll do for the break guys. Thanks again for the fill. Next up we're moving into football.